Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск в бинарном файле [D5, WinXP]


Страницы:   1 2 3 4 5 6 7 8 9 10 ... 13 14

Dimaxx ©   (2004-09-24 23:32:00) 

Сабж. Нужен алгоритм действительно быстрого поиска последовательности байт любой длины в файлах любого размера (до гигабайта). Читать кусками по-деревенски не катит. Раньше у меня был алгоритм, но с падением Фуджика все пропало.


Sha   (2004-10-06 18:18:00) [41]

Defunct ©   (06.10.04 18:07) [222]

Строку из одного 'a' тест никогда не генерирует.
В тесте используются строки длиной 4*n+3 - они с учетом
терминатора всегда занимают целое число двойных слов.


Sha   (2004-10-06 18:13:00) [42]

> Defunct

Ломается при таком обращении ConstantPos('ef9','efg').
Первая пересылка
@@Scan4:
 Mov  Ch,[EAx]

проходит нормально, т.к. адрес в edx выровнен.
При заходе на вторую пересылку адрес в edx уже на 1 больше.
Старший байт читаемого слова лежит на защищенной странице => AV.


Defunct   (2004-10-06 18:07:00) [43]

Или я что-то там не понял, или тест работает не совсем корректно.

Хочу немного уточнить задачу.

Допустим строка из одного символа 'a', она ведь поидее выровняна до DWord т.е. реальная длинна = |-8| +  4 = 12

-8 Dword
-4 Dword
0  'a'
1  0  
2  мусор
3  мусор

У меня происходит чтение строки
@CharPos:
Mov EAx, [EDx]
за DWord выхода нет, но Validation0 вызывает исключение именно на этой строчке. Поставил проверку на 0 (думал может туда случайно проходит вызов при буфере = 0) ничего не изменилось.


Jeer   (2004-10-06 18:04:00) [44]

Грандиозно мужики !
Живо мне напомнило успешные попытки втиснуть в 64K и добиться нужного быстродействия для бортового компьютера на i8080 (580)
решения навигационных задач подводного средства движения в далекие 70-е годы.

Так держать !


Defunct   (2004-10-06 17:51:00) [45]

> Такой if встречается в 2-х местах (Validate & ValidateAll).
Исправил оба?


Исправил только ValidateAll,
все теперь порядок, вижу где выходит.

сейчас подправлю.


Sha   (2004-10-06 17:43:00) [46]

> Defunct ©   (06.10.04 17:25) [218]
> if Validate0 {[198]} and

Такой if встречается в 2-х местах (Validate & ValidateAll).
Исправил оба?

> Если вас не затруднит, ...
Давай на "ты". Конечно, посмотрю. Но чуть позже.


Defunct   (2004-10-06 17:25:00) [47]

> Sha

хм..

    if Validate0 {[198]} and
       Validate1 and
       Validate2 and
       Validate3 and
       Validate4 and
       Validate5 and
       Validate6 and
       Validate7 and
       Validate8 and
       Validate9 and
       Validate10 and
       Validate11 then

PosDef_MMX  Passed

Если вас не затруднит, можете посмотреть где именно происходит выход за границу последнего Dword, потому как проверял на разных компах, везде проходит. (сам я не могу найти).


Sha   (2004-10-06 17:02:00) [48]

> Defunct ©   (06.10.04 16:33) [216]
> Функция [193] прошла тест [198] так что можете смело использовать.

На моем компьютере не проходит.


Defunct   (2004-10-06 16:33:00) [49]

>Sha [198]

Функция [193] прошла тест [198] так что можете смело использовать.

> Ihor Osov'yak ©   (06.10.04 01:06) [204]

[193] - полный рабочий вариант кода.
[195] - тесты PosDef_MMX = [193]


GuAV   (2004-10-06 12:13:00) [50]

Sha ©   (06.10.04 09:47) [212]
Я поняла в чём дело.
 Call @@CharPos
Отсюда вход с not alined EDX.


GuAV   (2004-10-06 12:13:00) [51]

Sha ©   (06.10.04 09:47) [212]
Я понял в чём дело.
 Call @@CharPos
Отсюда вход с not alined EDX.


Sha   (2004-10-06 09:48:00) [52]

Конец строки (терминатор) фиксирован на верхнейгранице страницы.


Sha   (2004-10-06 09:47:00) [53]

> GuAV ©   (06.10.04 01:28) [207]
> Хотя в тесте от Sha тоже ошибка. Или фича. Мы ведь
> договорились, что строка начинается на границе двойного слова или как ? [183]

У меня так и сделано.
Длина строки = 4n+3.
Конец строки (терминатор) фиксирован на нижней границе страницы.
Начало строки плавает. Но всегда находится на грацице двойного слова.


GuAV   (2004-10-06 03:12:00) [54]

Тут появиась мысль, ка сделать фцию, проходящую любые подобные validate0. Надо сделать вначале test edx, 3; jnz odd_align и там обработать такую ситуацию, обработав эти 1..3 байт и вернуться. Код обработки может быть и не оптимальным, лишь бы он корректно работал.


GuAV   (2004-10-06 02:07:00) [55]

Хотя поскольку ошибка приведёт AV именно в месте его причины, а не далеко после процедуры можно просто завернуть её в try... except on EAccesViolation do Result:=0 end;
Этот код может кому-то не понравится, но он нужен только в случае вольностей упомянутых в [208], в "нормальном" режиме функция не приводит к AV.


GuAV   (2004-10-06 01:58:00) [56]

Тогда берите любую функцию от JOH. Они прошли даже мой агрессивный тест, когда даже к 0-терминатору обратится нельзя.


Ihor Osov'yak   (2004-10-06 01:49:00) [57]

2 [207] GuAV ©   (06.10.04 01:28)
ну, иногда лучше перебдить, чем недобдить..
Предположим фантастический вариант - я содал тело строки ручками.. не на границе двойного слова. И передал как параметр.. :-)
Лично я не сторонник таких финтов, но в принцыпе такое может быть. Поэтому я бы дал предпочтение функции, прошедшей валидацию от Sha.


GuAV   (2004-10-06 01:28:00) [58]

Хотя в тесте от Sha тоже ошибка. Или фича. Мы ведь договорились, что строка начинается на границе двойного слова или как ? [183]
Видимо прийдётся делать Validate для Validate 0 8-))


Ihor Osov'yak   (2004-10-06 01:20:00) [59]

2 [205] GuAV ©   (06.10.04 01:16)

ок, либо подожду, либо когда-то повожусь с вашим кодом. может. если будет время и энтузиазм..


GuAV   (2004-10-06 01:16:00) [60]

Ihor Osov'yak ©   (06.10.04 01:06) [204]
пока что [193]. Однако он ещё не проходит тест на выход из буфера.  

[203] - я привел ошибочный код. как сейчас понял зря.


Страницы:   1 2 3 4 5 6 7 8 9 10 ... 13 14

Наверх

Титульная страница Поиск, карта сайта Написать письмо