Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Pos не чуствителен к регистру букв


Автор: Elfebet 7.10.2006, 15:33
сабж.
сразу скажу писать функцию типа поверх функции Pos мне не нужно, нужен аналог Pos, но чтоб он не был чувствителен к регистру букв и скорость работы функции осталось таже как и у Pos (будет лучше если даже работать будет намного быстрее).

и еще вопрос функция Pos написана на ассемблере или как? почему-то в делфях нельзя посмотреть код функции Pos.
и что быстрее выполняется поиск текста чере цикл FOR или использование POS.

спасибо!

Автор: Snowy 7.10.2006, 16:24
Да. pos написана на асме.
Просто нужно искать function _pos, а не pos.
Для поиска без учёта регистра, нужно перевести искомую строку и подстроку в верхний или нижний регистр.

Автор: Fedia 9.10.2006, 00:17
Цитата(Elfebet @  7.10.2006,  15:33 Найти цитируемый пост)
почему-то в делфях нельзя посмотреть код функции Pos.

Посмотреть asm код функции Pos можно в модуле System.pas по ключевому слову _LStrPos. Или если поставить в настройках проекта галочку "Use Debug DCUs" и перейти на эту функцию по F7.
Как написал Snowy, для поиска без учета регистра проще всего переводить искомую строку и текст, в котором осуществляется поиск к одному из регистров, например: 
Код

  i:=Pos(AnsiLowerCase(subS), AnsiLowerCase(S));
.
Цитата(Elfebet @  7.10.2006,  15:33 Найти цитируемый пост)
что быстрее выполняется поиск текста чере цикл FOR или использование POS

Зависит от задачи, но думаю в 90% случаев поиск будет быстрее осуществлен через Pos.

Вот, кстати, один из самых быстрых http://www.fastcode.dk/fastcodeproject/fastcodeproject/40.htm (регистрозависимый):
Код

function PosShaAsm5_b(const SubStr: AnsiString; const Str: AnsiString): Integer;
asm
       push  ebx
       push  esi
       add   esp, -16
       test  edx, edx
       jz    @NotFound
       test  eax, eax
       jz    @NotFound
       mov   esi, [edx-4] //Length(Str)
       mov   ebx, [eax-4] //Length(Substr)
       cmp   esi, ebx
       jl    @NotFound
       test  ebx, ebx
       jle   @NotFound
       dec   ebx
       add   esi, edx
       add   edx, ebx
       mov   [esp+8], esi
       add   eax, ebx
       mov   [esp+4], edx
       neg   ebx
       movzx ecx, byte ptr [eax]
       mov   [esp], ebx
       jnz   @FindString

       sub   esi, 2
       mov   [esp+12], esi

@FindChar2:
       cmp   cl, [edx]
       jz    @Matched0ch
       cmp   cl, [edx+1]
       jz    @Matched1ch
       add   edx, 2
       cmp   edx, [esp+12]
       jb    @FindChar4
       cmp   edx, [esp+8]
       jb    @FindChar2
@NotFound:
       xor   eax, eax
       jmp   @Exit0ch

@FindChar4:
       cmp   cl, [edx]
       jz    @Matched0ch
       cmp   cl, [edx+1]
       jz    @Matched1ch
       cmp   cl, [edx+2]
       jz    @Matched2ch
       cmp   cl, [edx+3]
       jz    @Matched3ch
       add   edx, 4
       cmp   edx, [esp+12]
       jb    @FindChar4
       cmp   edx, [esp+8]
       jb    @FindChar2
       xor   eax, eax
       jmp   @Exit0ch

@Matched2ch:
       add   edx, 2
@Matched0ch:
       inc   edx
       mov   eax, edx
       sub   eax, [esp+4]
@Exit0ch:
       add   esp, 16
       pop   esi
       pop   ebx
       ret

@Matched3ch:
       add   edx, 2
@Matched1ch:
       add   edx, 2
       xor   eax, eax
       cmp   edx, [esp+8]
       ja    @Exit1ch
       mov   eax, edx
       sub   eax, [esp+4]
@Exit1ch:
       add   esp, 16
       pop   esi
       pop   ebx
       ret

@FindString4:
       cmp   cl, [edx]
       jz    @Test0
       cmp   cl, [edx+1]
       jz    @Test1
       cmp   cl, [edx+2]
       jz    @Test2
       cmp   cl, [edx+3]
       jz    @Test3
       add   edx, 4
       cmp   edx, [esp+12]
       jb    @FindString4
       cmp   edx, [esp+8]
       jb    @FindString2
       xor   eax, eax
       jmp   @Exit1

@FindString:
       sub   esi, 2
       mov   [esp+12], esi
@FindString2:
       cmp   cl, [edx]
       jz    @Test0
@AfterTest0:
       cmp   cl, [edx+1]
       jz    @Test1
@AfterTest1:
       add   edx, 2
       cmp   edx, [esp+12]
       jb    @FindString4
       cmp   edx, [esp+8]
       jb    @FindString2
       xor   eax, eax
       jmp   @Exit1

@Test3:
       add   edx, 2
@Test1:
       mov   esi, [esp]
@Loop1:
       movzx ebx, word ptr [esi+eax]
       cmp   bx, word ptr [esi+edx+1]
       jnz   @AfterTest1
       add   esi, 2
       jl    @Loop1
       add   edx, 2
       xor   eax, eax
       cmp   edx, [esp+8]
       ja    @Exit1
@RetCode1:
       mov   eax, edx
       sub   eax, [esp+4]
@Exit1:
       add   esp, 16
       pop   esi
       pop   ebx
       ret

@Test2:
       add   edx,2
@Test0:
       mov   esi, [esp]
@Loop0:
       movzx ebx, word ptr [esi+eax]
       cmp   bx, word ptr [esi+edx]
       jnz   @AfterTest0
       add   esi, 2
       jl    @Loop0
       inc   edx
@RetCode0:
       mov   eax, edx
       sub   eax, [esp+4]
       add   esp, 16
       pop   esi
       pop   ebx
       end;

Автор: ivan219 10.10.2006, 00:58
Цитата(Fedia @  9.10.2006,  00:17 Найти цитируемый пост)
"Use Debug DCUs"

Абалдеть а размер EXE при этом на 100кБ поправился что это такое и зачем нужно smile 

Автор: Fedia 10.10.2006, 02:42
Цитата(ivan219 @  10.10.2006,  00:58 Найти цитируемый пост)
Абалдеть а размер EXE при этом на 100кБ поправился что это такое и зачем нужно

Обобщенно можно сказать, что эта опция предназначена для возможности отладки ядра VCL. Подробнее в справочной системе: 
Цитата

The debug DCUILs/DCUs contain debug information and are built with stack frames. When this option is checked, the compliler prepends the debug DCUIL/DCU path to the unit search path specified in Debug Source Path on the Directories/Conditionals page.

Автор: Matematik 10.10.2006, 07:54
Библиотека AcedUtils, модуль AcedStrings.pas
функция называется как-то PosText()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)