Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизПроблемы с функцией Pos() Найти похожие ветки
← →
yustaz (2004-05-21 17:13) [0]Дело вот в чем:
есть список строк (DataString: TStrings) и список слов (Word: TStrings)
Программа берет по очереди строки из DataString и проверяет встречается ли в них слово из списка Word.
Делаю так:
{...
код
...}
For i:=0 to DataString.Count-1 do
begin
For j:=0 to Word.Count-1 do
begin
if Pos(Word.Strings[j],DataString.Strings[i]) then //...
end;
end;
проблема в том, что Pos() всегда возващает 0
но, если заменить Word.Strings[j] на слово, т.е. написать:
if Pos("blabla",DataString.Strings[i]) then //...
то Pos() слово находит и возвращает отличное от нуля значение
где грабли?
я уже пробовал писать и PChar(Word.Strings[j]), не помогает.
помогите, кто сталкивался, направьте на путь истинный.
← →
BFG9k (2004-05-21 17:21) [1]Кажется , проблема в Word (кстати , не задумывался , что так называется целочисленный тип - подбери другое название) , посмотри , что у тебя хранится в нем , а уже потом пеняй на Pos. Короче будет DataString[i] , а не DataString.Strings[i].
← →
Внук © (2004-05-21 17:21) [2]Возможно, проблема в том, что Pos is case sensitive. Приведи значения Word.Strings[j] и DataString.Strings[i] на той итерации, где Pos по твоему мнению должен вернуть не ноль.
← →
BFG9k (2004-05-21 17:25) [3]if Pos(Word.Strings[j],DataString.Strings[i]) then ... - что за фигня ?
← →
Reindeer Moss Eater © (2004-05-21 17:33) [4]For i:=0 to DataString.Count-1 do
begin
For j:=0 to Word.Count-1 do
begin
ShowMessage("Я весь такой из себя не верю, что эти строки не равны"#13#10
+Word.Strings[j],DataString+#13#10+
DataString.Strings[i]
);
if Pos(Word.Strings[j],DataString.Strings[i]) then //...
end;
end;
← →
Anatoly Podgoretsky © (2004-05-21 17:47) [5]Все таки будьте поосторожнее с POS эта функция не возвращает логических значений
← →
yustaz (2004-05-21 17:57) [6]to BFG9k: нет, проблема не в названии, Word - это для примера взято, все названия переменных номальные,
имелось ввиду естественно
имелось ввиду:
if Pos(Word.Strings[j],DataString.Strings[i])>0 then ...
to Внук:
знаю, что Pos() чувствителен к регистру, проблема не в этом, все точно написано в одном регистре
to Reindeer Moss Eater:
ты это к чему?
---
пробовал другие методы поиска, ничего не помогает
если написать слово руками - находит, но если передать через
переменную то облом
я вот грешу на классы TStrings может они что-то подмешивают?
← →
yustaz (2004-05-21 17:58) [7]to Anatoly Podgoretsky:
знаю, опечатку исправил в предыдущем посте, может есть идеи по решению?
← →
Anatoly Podgoretsky © (2004-05-21 17:59) [8]Reindeer Moss Eater © (21.05.04 17:33) [4]
Я бы к этому еще добавил индикатор
+"!"+#13#10+
← →
Внук © (2004-05-21 18:06) [9]yustaz (21.05.04 17:58)
Если проблема с регистром известна, то банальнейшая отладка тут же решит проблему.
← →
yustaz (2004-05-21 18:08) [10]to Anatoly Podgoretsky :
эти строки не равны
← →
yustaz (2004-05-21 18:10) [11]to Внук:
банальная отладка как раз и не помагает
только если лезть в саму Pos()
← →
Внук © (2004-05-21 18:19) [12]>>yustaz (21.05.04 18:10) [11]
Не помогает? Даже если эти строки сначала присвоить отдельным строковым переменным, а потом просмотреть побайтно?
← →
yustaz (2004-05-21 18:29) [13]to Внук:
предлагаешь самому написать функцию поиска?
← →
panov © (2004-05-21 18:31) [14]Интересно, а как же создаются и заполняются списки?
Кода-то маловато приведено.
← →
yustaz (2004-05-21 18:37) [15]to panov:
var
Word: TStrings;
DataString: TStrings;
begin
Word := TStringList.Create;
DataString := TStringList.Create;
Word.Add("bla0");
Word.Add("bla1");
Word.Add("bla2");
Word.Add("bla3");
//...
Word.Add("blaN");
DataString.Add("str0");
DataString.Add("str1");
DataString.Add("str2");
DataString.Add("str3");
//...
DataString.Add("strN");
//...
Word.Free;
DataString.Free;
end;
← →
panov © (2004-05-21 18:42) [16]>yustaz (21.05.04 18:37) [15]
Проверил, прекрасно всё работает:
procedure TForm1.Button1Click(Sender: TObject);
var
Word: TStrings;
DataString: TStrings;
i,j: Integer;
begin
Word := TStringList.Create;
DataString := TStringList.Create;
Word.Add("bla0");
Word.Add("bla1");
Word.Add("bla2");
Word.Add("bla3");
//...
Word.Add("blaN");
DataString.Add("str0");
DataString.Add("str1");
DataString.Add("bla3");
DataString.Add("str3");
//...
DataString.Add("strN");
//...
For i:=0 to DataString.Count-1 do
For j:=0 to Word.Count-1 do
begin
if Pos(Word.Strings[j],DataString.Strings[i])>0 then ShowMessage("Found!");
end;
Word.Free;
DataString.Free;
end;
← →
WebErr © (2004-05-21 18:48) [17]
> panov © (21.05.04 18:42) [16]
Просто не могло не работать! :))))
← →
yustaz (2004-05-21 19:10) [18]блин, разобрался кажется
всем спасибо за помощь
просто намудрил всписках
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.032 c