Страница: 1 |
Вопрос: Передача параметров в процедуру | Добавлено: 06.01.08 00:30 |
Автор вопроса: ![]() |
Как лучше экономичней по времени, по памяти передать ~5кб текста в качестве параметра? ByRef или ByVal? |
Ответы | Всего ответов: 12 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 36 Ответов: 326 |
Профиль | Цитата | #1 | Добавлено: 06.01.08 01:11 |
http://msdn.microsoft.com/library/RUS/vbcn7/html/vaconargumentpassingmechanism.asp |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #2 | Добавлено: 06.01.08 01:12 |
ByRef. ИМХО, все что больше 4байт - лучше ByRef передавать.
|
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 06.01.08 01:42 |
Еще вопрос. Надо мне этот самый переданный текст разделить на строки. Для этого:
1.либо делать Replace$(vbCr на vbLf или наоборот), а потом InStr искать один из символов 2.либо искать и тот и другой символ (уже сделал) Стоит ли делать через Replace ради упрощения кода? Сам текст - не больше 5кб, как я уже говорил. з.ы. к сожалению, разделителем строк по инициативе ZaharS может быть не только chr(10)&chr(13) ![]() |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #4 | Добавлено: 06.01.08 01:53 |
может функция Split поможет?
|
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 06.01.08 02:48 |
Вопрос повторю. Не слишком ли медленно работает Replace, если текст 5кб? Мне с реплейсом проще было бы.
Split не поможет. Т.к. строки разделяются чем угодно. Хоть CR, хоть Lf, хоть их сочетанием. К тому же разделителями еще являются ТАБ и = При этом если в начале строки встретили #, то все что далее и до конца строки - комментарий. Более того - в комментарии таб и = не являются разделителями строк))))) Вот так вот жоско ![]() з.ы. я тоже люблю рекламу) Все ставьте MobiCraft на мобильники! Записывайтесь в тестеры! Ищите MC на мотофане и sourceforge.net |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 278109632 Вопросов: 42 Ответов: 3949 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 06.01.08 03:10 |
для начала надо отпарсить текс и отбросить все комментарии, вообще-то ![]() P.S. комментарии не обязательно килять в первом проходе, можно по ходу все сделать. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #7 | Добавлено: 06.01.08 03:17 |
Для 5Кб Replace тормозить не будет (смотря что понимать под тормозами, конечно...)
Если критично быстродействие, то советую смотреть в сторону Regular Expressions (Регулярные выражения). Я регэкспами когда-то е-майлы из текстовиков грабил, никто не мешает написать регэксп, который будет возвращать текст, поделенный в массив по нужным разделителям (CR, LF, CRLF, TAB или что там нужно) Например, что-то вроде: (.*?(\r\n|\r|\n|\t)) |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #8 | Добавлено: 06.01.08 08:54 |
Кто покажет универсальный код для сплита на строки вне зависимости от того что является разделителем - будет большой респект |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 06.01.08 15:10 |
Оказывается комментарий может начинаться не только с начала строки,но вообще где угодно.
regExp не использую, т.к. это не обоснованно имхо. Текст в несколько тсяч символов и самому можно распарсить. Steel Brand, а разве Split не универсален? другое дело, что к примеру у меня разделителей несколько видов... Наверное лучше будет сделать так: Привести CR, Lf, CR+Lf к чему-то одному, например к CR. Затем искать # и удалять всё до CR (т.к. ТАБ и = в комментарии не явл. разделителями строк). После удаления комментариев заменять Tab и = на CR. Сделать Split указав CR как разделитель |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ICQ: 295002202 Вопросов: 87 Ответов: 1684 |
Профиль | Цитата | #10 | Добавлено: 06.01.08 16:08 |
Надо пример текста, который нужно парсить. Желательно сложный (со всеми случаями). И еще надо привести что должно быть в результате.
|
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 06.01.08 17:08 |
Пример:
=, Tab одно и то же! CR, Lf, Cr+Lf одно и то же! +++++++++++++++++++++++++ string1 string2 #comment1=comment string3=string4 string5 #comment2[TAB]something string6 +++++++++++++++++++++++++ Значения string1-6 нужно занести в коллекцию (массив). Т.е. отрубаем все комментарии и пустые строки. А вот реальный пример файла карты http://slil.ru/25321771 |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 06.01.08 17:37 |
Вот это вроде бы работает. И кода на удивление мало![]() Private Sub InputLines(ByRef Str As String)
Dim pos1 As Long, pos2 As Long, tmp As String Str = Str & vbCr 'Чтобы не пропускать конец файла Str = Replace$(Str, vbCrLf, vbCr) Str = Replace$(Str, vbLf, vbCr) pos1 = 1 Do 'Удаление комментариев pos1 = InStr(pos1, Str, "#" ![]() If pos1 = 0 Then Exit Do pos2 = InStr(pos1, Str, vbCr) Str = Left$(Str, pos1 - 1) & Right$(Str, Len(Str) - pos2 + 1) Loop Str = Replace$(Str, vbTab, vbCr) Str = Replace$(Str, "=", vbCr) pos1 = 1 Do While pos1 < Len(Str) 'Добавление строк в коллекцию pos2 = InStr(pos1, Str, vbCr) 'Ищем конец строки tmp = Trim$(Mid(Str, pos1, pos2 - pos1)) If tmp <> vbNullString Then Strings.Add tmp End If pos1 = pos2 + 1 Loop End Sub |
Страница: 1 |
|