Фильтрация строк

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

nagash
новенький
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05
Контактная информация:

Фильтрация строк

Сообщение nagash »

Дан входной тесктовый файл, нужно из него выбрать строки, содержащие нужное слово или словосочетание и записать их в другой файл.

Написал функцию, возвращающую true, если данное слово или словосочетание в строке присутствует, но видно где-то накосячил, оно всегда выдает false. Не могу отследить где, кто может помочь или посоветовать как подобное сделать проще?

Код: Выделить всё

function parse(curstr:string; x:string):boolean;
var
  valstr,
  valx,
  i,
  j,
  k:integer;
begin
  valstr := length(curstr);
  valx := length(x);
  i := 1;
  j := 1;
  repeat begin
    if curstr[i] = x[j] then begin
      k := i;
      if curstr[k + 1] = x[j + 1] then begin
        inc(k);
        repeat begin
          if curstr[k] = x[j] then parse := true else parse := false;
          inc(j);
        end;
        until j=valx;
      j := 1;
      end;
    end;
    inc(i);
  end;
  until i=valstr;
end;
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

А функция pos не подходит?.
nagash
новенький
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05
Контактная информация:

Сообщение nagash »

точно... забыл про нее
спасибо огромное :)

Добавлено спустя 22 часа 4 минуты 41 секунду:
пишу тут же, потому что это по сути продолжение
поиск работает, теперь мне нужно сделать его регистронезависимым с поддержкой русского

написал вот что:

Код: Выделить всё

  
for i := 1 to length(curstr) do begin
    case curstr[i] of
    'а': curstr[i]:= 'А';
    'б': curstr[i]:= 'Б';
...
    'ю': curstr[i]:= 'Ю';
    'я': curstr[i]:= 'Я';
    else curstr[i] := upcase(curstr[i]);
  end;


начало ругаться вот так - Error: Illegal assignment to for-loop variable ”i”
порылся в инете, прочел, что "You cannot assign values to loop variables inside the loop"
подумал, что может компилятор обижается на то, что я использую i в самом цикле... тогда сделал следующим образом:

Код: Выделить всё

  k := 1;
  for i := 1 to length(curstr) do begin
    case curstr[k] of
    'а': curstr[k]:= 'А';
    'б': curstr[k]:= 'Б';
...
    'ю': curstr[k]:= 'Ю';
    'я': curstr[k]:= 'Я';
    else curstr[k] := upcase(curstr[k]);
    inc(k);
  end;


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

Код: Выделить всё

  k := 1;
  for i := 1 to length(x) do begin
    case x[k] of
    'а': x[k]:= 'А';
    'б': x[k]:= 'Б';
...
    'ю': x[k]:= 'Ю';
    'я': x[k]:= 'Я';
    else x[k] := upcase(x[k]);
    inc(k);
  end;


и снова получаю Error: Illegal assignment to for-loop variable ”i”


Я чего-то не понимаю или эта ошибка возникает от положения звезд на небе? :)

Добавлено спустя 58 минут 38 секунд:
извиняюсь, разобрался сам

такая ошибка выводится если пропущен end в конструкции case ... of ... end;
правда логики я все равно не вижу, ну да и черт с ним
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

ммм, а зачем каждый символ заменять? Чем не подходят функции

Код: Выделить всё

UpperCase();
AnsiUpperCase();
nagash
новенький
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05
Контактная информация:

Сообщение nagash »

B4rr4cuda писал(а):ммм, а зачем каждый символ заменять? Чем не подходят функции

Код: Выделить всё

UpperCase();
AnsiUpperCase();

хм... а в них есть поддержка кириллицы?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

В AnsiUpperCase усть
nagash
новенький
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05
Контактная информация:

Сообщение nagash »

В принципе в эту же тему.
Ассемблер я не знаю, но надо скомпилить вот это:

Код: Выделить всё

{$ASMMODE INTEL}
unit cases;
interface

Function  UpCaseChar(C:Char):Char;
Procedure UpCaseStr(var S:String);

implementation
Function  UpCaseChar(C:Char):Char;assembler;
asm
  mov al,C
  cmp al,$61
  jb @Exit
  cmp al,$7b
  jb @Up20
  cmp al,$a0
  jb @Exit
  cmp al,$b0
  jb @Up20
  cmp al,$e0
  jb @Exit
  cmp al,$ef
  ja @Exit
  sub al,$50
  jmp @Exit
@Up20:
  sub al,$20
@Exit:
end;


Procedure UpCaseStr(var S:String);assembler;
asm
  cld
  les di,S
  mov al,byte ptr es:[di]
  cmp al,0
  je @Exit
  mov cl,al
  mov ch,0
  inc di
@Loop:
  mov al,byte ptr es:[di]
  push ax
  Call far ptr UpCaseChar
  stosb
  loop @Loop
@Exit:
end;
end.


При компиляции:
(45,8) Warning: FAR ignored
(45,16) Error: Invalid operand type

может кто знающий подскажет?

45-я строка это

Код: Выделить всё

Call far ptr UpCaseChar
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

А чем Вам AnsiUpperCase() не подощло? Зачем Вам собственная функция?
nagash
новенький
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05
Контактная информация:

Сообщение nagash »

Да это уже не из той оперы, это я пытаюсь скомпилить одну бухгалтерскую программку :)
Вот и ругается...
Конечно, если никто не подскажет насчет этой ошибки, то я наверное перепишу этот UpCaseStr с использованием AnsiUpperCase
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

nagash писал(а):Конечно, если никто не подскажет насчет этой ошибки, то я наверное перепишу этот UpCaseStr с использованием AnsiUpperCase

Подсказать - подскажем, только легче вряд ли станет.
Это 16-битный код, который в 32-битном FPC не пройдет просто никак. Если far ptr можно просто убрать, то всякие es:[di] уже просто так не уберешь.
nagash
новенький
Сообщения: 50
Зарегистрирован: 21.05.2007 08:27:05
Контактная информация:

Сообщение nagash »

спасибо, тогда перепишу :)
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

У меня AnsiUpperCase не преобразовывает русские символы в верхний регистр :(
Lazarus 0.9.27 SVN QT, делаю под ним консольное приложение.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Подскажите работающий вариант преобразования русских символов в верхний регистр и обратно. Строка - UTF8String.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Так ведь AnsiUpperCase работает с Ansi строками и применение её для UTF8 негодится!
поробуйте вот так:

Код: Выделить всё

  UTF8Encode(WideUpperCase(UTF8Decode(str))); 
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

VirtUX
С UTF8 надо вот енту штукенцию - function UTF8UpperCase(const s: String): String; из lclprocs.pas.
Ответить