Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Проблемы с функцией 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.064 c
1-1085531899
Глеб
2004-05-26 04:38
2004.06.06
Скриншот


14-1085121676
Bunny
2004-05-21 10:41
2004.06.06
IDE not Found.


1-1085546082
Глеб
2004-05-26 08:34
2004.06.06
Перемещение фокуса


4-1083572914
demondar
2004-05-03 12:28
2004.06.06
COM-порт


4-1083163044
Delphist
2004-04-28 18:37
2004.06.06
NtQuerySystemInformation, Как работает?