Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Передача параметров в процедуру Добавлено: 06.01.08 00:30  

Автор вопроса:  Winand | Web-сайт: winandfx.narod.ru
Как лучше экономичней по времени, по памяти передать ~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-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #5
Добавлено: 06.01.08 02:48
Вопрос повторю. Не слишком ли медленно работает Replace, если текст 5кб? Мне с реплейсом проще было бы.

Split не поможет. Т.к. строки разделяются чем угодно. Хоть CR, хоть Lf, хоть их сочетанием. К тому же разделителями еще являются ТАБ и =
При этом если в начале строки встретили #, то все что далее и до конца строки - комментарий. Более того - в комментарии таб и = не являются разделителями строк))))) Вот так вот жоско=))))

з.ы. я тоже люблю рекламу) Все ставьте MobiCraft на мобильники! Записывайтесь в тестеры! Ищите MC на мотофане и sourceforge.net

Ответить

Номер ответа: 6
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #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-сайт: winandfx.narod.ru
 Профиль | | #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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам