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

Вниз

AnsiCompare и StrList.Find   Найти похожие ветки 

 
BMouradov   (2009-03-20 16:43) [0]

Подскажите, уважаемые, почему код выдает разные результаты? KOL 2.87.

uses KOL;
begin
 if AnsiCompareStr("R", "d") < 0 then
   ShowMessage("<")
 else
   ShowMessage(">=");    //  <--

 if StrComp("R", "d") < 0 then
   ShowMessage("<")      // <--
 else
   ShowMessage(">=");
end.

обе функции должны работать с учетом регистра, и в области латинских букв вроде должны дать одинаковые резултьтаты?

В результате, процедура StrList.Find работает только если сделать StrList.Sort(False), хотя по документации должно быть StrList.Sort(True). Ошибка ли это? Если да, то исправлена ли в последних версиях KOL?


 
mdw ©   (2009-03-20 17:51) [1]

Сталкивался с таким, не фига, результат разный получается. Функции AnsiCompareStr и StrComp по разному работают.

Еще ньюанс, если в списке несколько одинаковых строк, то не факт, что будет найдена первая. Просто удовлетворяюшая условию, поэтому если нужна первая, нужно еше от найденой строки назад цикл делать, пока равна (Пол дня убил пока понял в чем дело...:().


 
mdw ©   (2009-03-20 19:31) [2]

Это я уже StrList.Find имел в виду.


 
Vladimir Kladov ©   (2009-03-22 19:50) [3]

function Find(const S: AnsiString; var Index: Integer): Boolean;
   {* Returns Index of the first string, equal or greater to given pattern, but
      works only for sorted TStrList object
. Returns TRUE if exact string found,
      otherwise nearest (greater then a pattern) string index is returned,
      and the result is FALSE. }


 
mdw   (2009-03-22 22:14) [4]

2 Vladimir Kladov
Владимир, естественно список отсортирован. Но "Returns Index of the first string" выполняется не всегда, вернеее смотря что понимать, под ПЕРВЫМ. Если первая найденая, то да, но не факт, что первая найденая, стоит первой в списке среди одинаковых строк (если их несколько).


 
BMouradov   (2009-03-23 01:42) [5]

Даже если все элементы разные, не выполняется "Returns TRUE if exact string found". Find ищет не только exact, но и case-insensitive.
Почему же при Sort используется StrComp, а при Find - AnsiCompareStr?


 
mdw ©   (2009-03-23 10:56) [6]

AnsiSort() используйте тогда.


 
Vladimir Kladov ©   (2009-03-23 15:53) [7]

Да, я понял, в чём претензия. Дело в том, что ищет Find методом деления пополам. Это намного быстрее, чем каждый раз просматривать с самого начала. Но если строки совпали, то какая должна быть уже разница... Или тогда организуйти поиск сами, или используйте Find и после него небольшой пробег назад до первой несовпавшей строки. Вообще-то когда я делал этот Find, я думал прежде всего о списках строк, в которых одинаковых нет.


 
BMouradov   (2009-03-23 19:02) [8]

Это претензия от mdw. Я же пишу о другом - по документации Find должен искать строки case sensitive, а в реальности - case insensitive. Иногда это существенно! Также, в документации к Find тогда должна быть указана функция, чем сортировать: то ли Sort(False), то ли AnsiSort... Или, может сделать отдельную процедуру Find_NoCase?

Так же и AnsiCompareStr вроде должен был выдать False, а выдает True. То ли в документации непорядок, то ли эти функции выполняют не совсем то, что от них ждут, то ли я не понимаю, а почему они именно так работают. Может кто-нибудь объяснить?



Страницы: 1 вся ветка

Текущий архив: 2011.09.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
1-1267021784
nokla user
2010-02-24 17:29
2011.09.25
Окно копирования windows


15-1306581550
Smile
2011-05-28 15:19
2011.09.25
Красивое видео с цирковым номерм баланса


15-1306822456
Evgeniy_gd
2011-05-31 10:14
2011.09.25
Покритикуйте инструкцию по использованию флешек USB.


6-1241804128
DVM
2009-05-08 21:35
2011.09.25
Определить режим работы сокета: блок. или неблок. в Winsock


15-1299763793
Юрий
2011-03-10 16:29
2011.09.25
С днем рождения ! 10 марта 2011 четверг