|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ошибка при копировании символа из строки
Добрый день. Есть код
Код:
function TForm1.CompareWords(var W1,W2: string; var CompareLevel:integer):boolean; var NumSymWord1,NumSymWord2,Divide,i:integer; s1,s2: char; begin NumSymWord1 := Length(W1); NumSymWord2 :=0; (*============ ЦИКЛ =============================*) for i := 1 to Length(W1) do begin s1:=W1[1]; s2:=W2[1]; (*если ПЕРЕМ=пусто то ошибка, отладчик указывает на эту строку*) if s1=s2 then NumSymWord2 := (NumSymWord2+1); delete(W1, 1,1); (*удаляем уже обработанный символ*) delete(W2, 1,1); end; (*===============================================*) if NumSymWord1 > 0 then begin Divide := ((NumSymWord2*100)div NumSymWord1); end; if Divide > CompareLevel then CompareWords := TRUE; end; Функция проверки соответсвия двух слов посимвольно, с выводом результата ДА или НЕТ. и с порогом определения Вопрос: почему когда в s2:=W2[1]; нет символов(удалены в передыдущих циклах) выскакивает ошибка? при попытке присвоения символьной переменной NIL? где тут ошибка? |
#2
|
|||
|
|||
Код:
''[1] //возвращает не nil, а ошибку в delphi |
#3
|
||||
|
||||
А зачем вообще удалять из строки символы после сравнения, время на это тратить (это наверное из-за разной длины входных слов), вот слегка подправленный варьянт, вроде так попроще будет:
Код:
function TForm1.CompareWords(var W1,W2: string; var CompareLevel:integer):boolean; function CompareLen(len1, len2: integer): integer; begin if len1 >= len2 then Result:= len1 else Result:= len2; end; var //NumSymWord1, NumSymWord2,Divide,i:integer; //s1,s2: char; begin //NumSymWord1 := Length(W1); NumSymWord2 :=0; (*============ ЦИКЛ =============================*) for i := 1 to CompareLen(Length(W1),Length(W2)) do // begin //s1:=W1[1]; //s2:=W2[1]; (*если ПЕРЕМ=пусто то ошибка, отладчик указывает на эту строку*) if W1[i]=W2[i] then //if s1=s2 then inc(NumSymWord2); //NumSymWord2 := (NumSymWord2+1); //delete(W1, 1,1); (*удаляем уже обработанный символ*) //delete(W2, 1,1); // end; (*===============================================*) if Length(W1) >0 then //NumSymWord1 > 0 then // begin Divide := ((NumSymWord2*100)div Length(W1); // NumSymWord1); // end; Result:= Divide > CompareLevel; //if Divide > CompareLevel then // CompareWords := TRUE; end; Последний раз редактировалось Alegun, 14.07.2012 в 11:57. Причина: Дополнение |
#5
|
|||
|
|||
всем спасибо за ценные разъяснения
|