powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Совмщение переменных разного типа
15 сообщений из 40, страница 2 из 2
Совмщение переменных разного типа
    #40015315
Дмитрий П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Вот этот код распечатает все вхождения Component в ваш бинарный массив

Из вышеизложенного понятно что это не подойдет
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015316
Дмитрий П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Вот этот код распечатает все вхождения Component в ваш бинарный массив


Исходя из вышеизложенного, такой алгоритм меня никак устроить не может
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015319
Дмитрий П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Вот этот код распечатает все вхождения Component в ваш бинарный массив

Исходя из вышеизложенного, такой алгоритм меня никак устроить не может!

-------------------------
Прошу прощенья за дублирование, сообщения куда-то улетали. Оказалось на 2ю страницу
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015324
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий П.
booby
Вот этот код распечатает все вхождения Component в ваш бинарный массив


Исходя из вышеизложенного, такой алгоритм меня никак устроить не может


ааа... ну, извини тогда...
мне самому жаль, что попытался "отнять у тебя время".
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015648
Дмитрий П.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
А все-таки Ваш первый пример работает именно как надо!
Код: vbnet
1.
2.
3.
  Rem эта строка имитирует получение бинарных данных из файла
  ba_search = StrConv(Chr(0) & Chr(0) & "В этой строке есть первый " & Chr(0) & Chr(0) & _
  "Component, и есть второй " & Chr(0) & Chr(3) & "Component.", vbFromUnicode)

Вот это ближе к моему файлу и Ваш код все равно находит оба "Component"

До сего дня я считал что любая строковая функция застревает на нуле. Исследование StrStrA подтвердило это!

Сегодня я случайно обратил внимание на фрагмент в моем первом посте, вернее на его боевой аналог (там str обычная, НЕ с фиксированной длиной) и обнаружил что в конце цикла в переменой str присутствуют символы chr(0) и (другие непринтабельные).

И получается что функция InStr (как и InStrB) не застревает на нулях (и находит "Component")! Странно, вроде бы везде пишут что ноль это терминатор. Причем в файле есть блоки поиска где нет "Component" - на чем же тогда функция InStr останавливает поиск?

booby , Да, Ваш пример позволит мне избавится от побайтного копирования блока поиска. СПАСИБО!
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015661
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий П.,

Ура!
теперь может быть продолжение...

как найти автор"C2" и 4 байта 01 00 00 00 т.е. С2.1 - рассказывать, или теперь уже сами сообразите?
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015686
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий П.
booby
А все-таки Ваш первый пример работает именно как надо!
Код: vbnet
1.
2.
3.
  Rem эта строка имитирует получение бинарных данных из файла
  ba_search = StrConv(Chr(0) & Chr(0) & "В этой строке есть первый " & Chr(0) & Chr(0) & _
  "Component, и есть второй " & Chr(0) & Chr(3) & "Component.", vbFromUnicode)

Вот это ближе к моему файлу и Ваш код все равно находит оба "Component"

До сего дня я считал что любая строковая функция застревает на нуле. Исследование StrStrA подтвердило это!

Сегодня я случайно обратил внимание на фрагмент в моем первом посте, вернее на его боевой аналог (там str обычная, НЕ с фиксированной длиной) и обнаружил что в конце цикла в переменой str присутствуют символы chr(0) и (другие непринтабельные).

И получается что функция InStr (как и InStrB) не застревает на нулях (и находит "Component")! Странно, вроде бы везде пишут что ноль это терминатор. Причем в файле есть блоки поиска где нет "Component" - на чем же тогда функция InStr останавливает поиск?

booby , Да, Ваш пример позволит мне избавится от побайтного копирования блока поиска. СПАСИБО!

Если Вам нужно именно оптимальное решение, то это неверный путь. Т.к. при каждом вызове InStrB происходит преобразование массивов в строки, т.е. создаются временные Variant переменные которые потом преобразуются в Variant содержащие строки - по сути тоже что у Вас было изначально. InStr предназначена для работы со строками, а не с массивами.
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015703
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATM-TURBO 2,

вы про "premature optimization" когда-нибудь слышали, или про "критикуя предлагай"?

Что касается преобразования, то ваше утверждение-преостережение сводится к указанию
на полное копирование массива при каждом поиске.
В приципе, это достаточно легко проверяется экспериментальным путем,
и, если оно на самом деле справедливо в полной мере (чего я не знаю точно), то содержательно переход от "плохого" кода
к "хорошему на строках" происходит легко.

У человека разумного механизма поиска в руках вообще не было.
Теперь есть.

Это совсем даже близко не то же самое "что было с самого начала", хотя бы по числу конкатенаций,
и, тем более, по общей структуре кода.
Хотя на 20-килобайтных файлах разницу в скорости все равно будет измерить трудно.
Вы как-то свое свое утверждение о полном копировании можете аргументировать?

Вместе с тем, "ещё лучше" для него, может быть почти со 100% вероятностью ,
и особенно в условиях именно VB6, окажется самописный Кнут-Моррис-Пратт.
Если уж и переходить, конкретно от instrb над массивами, то гораздо лучше в его окружении, переходить не к работе с чистыми
строками, а сразу к Пратту над массивами, имея на руках версию кода, которая работает целиком на массивах.
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015708
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATM-TURBO 2,

между, прочим, я бы скорее предполагал, что внутреннее устройство Instr/Instrb состоит в том, что
по полученному указателю на строку строится описатель массива, с которым и происходит дальнейшая работа поиска.

По крайней мере теоретически, и по крайней мере для instrb, это оставляет возможность компилятору обеспечить
прямую работу с полученным байтовым массивом.

Все сказанное здесь - лишь версия.

Я в прошлом программировал на VB6, сейчас лишь пару-тройку раз в год vba касаюсь,
по какому-нибудь несчастному случаю.
Так что и многие детали, касательные языка, уже основательно забыты.
Но я не помню, не отложилось у меня в памяти ребра именно в указанном вами разрезе.
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015717
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий П.
До сего дня я считал что любая строковая функция застревает на нуле.

Ошибались. В VB нигде не используются нуль-терминированные строки.
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015720
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby
ATM-TURBO 2,

вы про "premature optimization" когда-нибудь слышали, или про "критикуя предлагай"?

Да я уже скинул решение на другом форуме .

booby
Что касается преобразования, то ваше утверждение-преостережение сводится к указанию
на полное копирование массива при каждом поиске.
В приципе, это достаточно легко проверяется экспериментальным путем,
и, если оно на самом деле справедливо в полной мере (чего я не знаю точно), то содержательно переход от "плохого" кода
к "хорошему на строках" происходит легко.

Поверь мне, я очень хорошо знаю как работает VB6 и его рантайм. Чтобы не быть голословным скажу что происходит вызов функции __vbaStrVarCopy которая принимая Variant в котором байтовый массив, преобразует его в BSTR посредством вызова VariantChangeTypeEx, которая в свою очередь непосредственно выполняет преобразование с помощью функции BstrFromVector. И это происходит дважды для каждого аргумента.

booby
Это совсем даже близко не то же самое "что было с самого начала", хотя бы по числу конкатенаций,
и, тем более, по общей структуре кода.
Хотя на 20-килобайтных файлах разницу в скорости все равно будет измерить трудно.
Вы как-то свое свое утверждение о полном копировании можете аргументировать?

Да, выше уже написал. "Что было с самого начала" - в алгоритмическом плане, происходит все тоже самое создание временной строки ну и т.п. У ТС задача в совмещении переменных, что явно противоположно.

booby
между, прочим, я бы скорее предполагал, что внутреннее устройство Instr/Instrb состоит в том, что
по полученному указателю на строку строится описатель массива, с которым и происходит дальнейшая работа поиска.

Нет. В этом никакого смысла нет.
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015723
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.
Дмитрий П.
До сего дня я считал что любая строковая функция застревает на нуле.

Ошибались. В VB нигде не используются нуль-терминированные строки.

Везде используются. BSTR - это строка с предпросчитаной длиной и нуль-терминалом.
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015732
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATM-TURBO 2,

уфф... Как вы вообще туда ходите... С таким диким количеством диких баннеров.
все проклясть можно только от одного вида...

Сдается, у вас там ошибка в алгоритме поиска.
Вы безусловно сдвигаете образец в точку обнаруженного несопоставления.
Что прямо ошибка, если частичное сопоставление уже произошло.
В алгоритме не хватает масива префиксов до настоящего Пратта.
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015805
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATM-TURBO 2,

Я ошибся.
Код у вас там правильный.
Это меня внешний вид сайта, видимо, ошеломил.

Но я не вижу причин не писать в этом месте стандартный вложенный цикл.
такой вариант мною на глаз легче воспринимается:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Private Function FindSignature2( _
                 ByRef bData() As Byte, _
                 ByRef bSearch() As Byte, _
                 ByVal lStart As Long _
                 ) As Long
                 
   FindSignature2 = -1&

   Dim b_cmp  As Boolean
   Dim iLastD As Long, iLastP As Long
   
   iLastD = UBound(bData)
   iLastP = UBound(bSearch)
   
      
   Dim iDataPos  As Long
   Dim iPatPos As Long
   
   For iDataPos = lStart To iLastD
     'ранний выход по превышению образцом проверяемого остатка массива остатка
     If iLastD - iDataPos < iLastP Then
        Exit Function
     End If
     ' ищем образец
     For iPatPos = 0 To iLastP
       b_cmp = (bData(iDataPos + iPatPos) = bSearch(iPatPos))
       If Not b_charcmp Then
         Exit For
       End If
     Next
     If iPatPos = iLastP And b_cmp Then
       FindSignature2 = iDataPos
       Exit For
     End If
   Next
   
End Function




(накидал без проверки)
...
Рейтинг: 0 / 0
Совмщение переменных разного типа
    #40015810
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

ага, опечатка есть - If Not b_charcmp Then
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Совмщение переменных разного типа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]