Страница: 1 |
Страница: 1 |
Вопрос: Передача параметров в процедуру
Добавлено: 06.01.08 00:30
Автор вопроса: Winand | Web-сайт:
Как лучше экономичней по времени, по памяти передать ~5кб текста в качестве параметра? ByRef или ByVal?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #1
Добавлено: 06.01.08 01:11
http://msdn.microsoft.com/library/RUS/vbcn7/html/vaconargumentpassingmechanism.asp
Номер ответа: 2
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #2
Добавлено: 06.01.08 01:12
ByRef. ИМХО, все что больше 4байт - лучше ByRef передавать.
Номер ответа: 3
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #3
Добавлено: 06.01.08 01:42
Еще вопрос. Надо мне этот самый переданный текст разделить на строки. Для этого:
1.либо делать Replace$(vbCr на vbLf или наоборот), а потом InStr искать один из символов
2.либо искать и тот и другой символ (уже сделал)
Стоит ли делать через Replace ради упрощения кода? Сам текст - не больше 5кб, как я уже говорил.
з.ы. к сожалению, разделителем строк по инициативе ZaharS может быть не только chr(10)&chr(13) )))
Номер ответа: 4
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #4
Добавлено: 06.01.08 01:53
может функция Split поможет?
Номер ответа: 5
Автор ответа:
Winand
Вопросов: 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
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #7
Добавлено: 06.01.08 03:17
Для 5Кб Replace тормозить не будет (смотря что понимать под тормозами, конечно...)
Если критично быстродействие, то советую смотреть в сторону Regular Expressions (Регулярные выражения).
Я регэкспами когда-то е-майлы из текстовиков грабил, никто не мешает написать регэксп, который будет возвращать текст, поделенный в массив по нужным разделителям (CR, LF, CRLF, TAB или что там нужно)
Например, что-то вроде: (.*?(\r\n|\r|\n|\t))
Номер ответа: 8
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #8
Добавлено: 06.01.08 08:54
Кто покажет универсальный код для сплита на строки вне зависимости от того что является разделителем - будет большой респект
Номер ответа: 9
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #9
Добавлено: 06.01.08 15:10
Оказывается комментарий может начинаться не только с начала строки,но вообще где угодно.
regExp не использую, т.к. это не обоснованно имхо. Текст в несколько тсяч символов и самому можно распарсить.
Steel Brand, а разве Split не универсален? другое дело, что к примеру у меня разделителей несколько видов...
Наверное лучше будет сделать так:
Привести CR, Lf, CR+Lf к чему-то одному, например к CR. Затем искать # и удалять всё до CR (т.к. ТАБ и = в комментарии не явл. разделителями строк). После удаления комментариев заменять Tab и = на CR. Сделать Split указав CR как разделитель
Номер ответа: 10
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #10
Добавлено: 06.01.08 16:08
Надо пример текста, который нужно парсить. Желательно сложный (со всеми случаями). И еще надо привести что должно быть в результате.
Номер ответа: 11
Автор ответа:
Winand
Вопросов: 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
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #12
Добавлено: 06.01.08 17:37
Вот это вроде бы работает. И кода на удивление мало)
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