Главная страница
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.01 c
15-1306408784
OW
2011-05-26 15:19
2011.09.25
Про ценообразование фруктов и овощей.


6-1242735446
Slavka
2009-05-19 16:17
2011.09.25
Вопрос по копированию папок с (и на) ftp целиком.


2-1307609717
@!!ex
2011-06-09 12:55
2011.09.25
Как установить Charset для всех шрифтов?


11-1237556635
BMouradov
2009-03-20 16:43
2011.09.25
AnsiCompare и StrList.Find


15-1307162500
boriskb
2011-06-04 08:41
2011.09.25
Не смог не поделиться