-
Подскажите, уважаемые, почему код выдает разные результаты? 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?
-
Сталкивался с таким, не фига, результат разный получается. Функции AnsiCompareStr и StrComp по разному работают.
Еще ньюанс, если в списке несколько одинаковых строк, то не факт, что будет найдена первая. Просто удовлетворяюшая условию, поэтому если нужна первая, нужно еше от найденой строки назад цикл делать, пока равна (Пол дня убил пока понял в чем дело...:().
-
Это я уже StrList.Find имел в виду.
-
function Find(const S: AnsiString; var Index: Integer): Boolean;
-
2 Vladimir Kladov Владимир, естественно список отсортирован. Но "Returns Index of the first string" выполняется не всегда, вернеее смотря что понимать, под ПЕРВЫМ. Если первая найденая, то да, но не факт, что первая найденая, стоит первой в списке среди одинаковых строк (если их несколько).
-
Даже если все элементы разные, не выполняется "Returns TRUE if exact string found". Find ищет не только exact, но и case-insensitive. Почему же при Sort используется StrComp, а при Find - AnsiCompareStr?
-
AnsiSort() используйте тогда.
-
Да, я понял, в чём претензия. Дело в том, что ищет Find методом деления пополам. Это намного быстрее, чем каждый раз просматривать с самого начала. Но если строки совпали, то какая должна быть уже разница... Или тогда организуйти поиск сами, или используйте Find и после него небольшой пробег назад до первой несовпавшей строки. Вообще-то когда я делал этот Find, я думал прежде всего о списках строк, в которых одинаковых нет.
-
Это претензия от mdw. Я же пишу о другом - по документации Find должен искать строки case sensitive, а в реальности - case insensitive. Иногда это существенно! Также, в документации к Find тогда должна быть указана функция, чем сортировать: то ли Sort(False), то ли AnsiSort... Или, может сделать отдельную процедуру Find_NoCase?
Так же и AnsiCompareStr вроде должен был выдать False, а выдает True. То ли в документации непорядок, то ли эти функции выполняют не совсем то, что от них ждут, то ли я не понимаю, а почему они именно так работают. Может кто-нибудь объяснить?
|