![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CompareStr vs StrComp
Seldoff © (2007-07-05 17:00:00)почему код CompareStr и StrComp отличается? я не силён в ассемблере, но по-моему код отличается не в плане отличий AnsiString от PChar (которые судя по _LStrToPChar минимальны), а в плане алгоритма сравнения. зачем две функции для одной задачи? и, главное, будут ли их результаты одинаковыми для любых входных строк?
может кто-нибудь, знающий ассемблер, переведёт их код на паскаль чтобы сравнить поведение?
clickmaker (2007-07-06 15:10:00) [1]
> почему StrComp взяли из FastCode, a CompareStr нет
чтобы могли почувствовать разницу?
Seldoff (2007-07-06 13:24:00) [2]
> REA (06.07.07 10:08) [7]
> В BDS задействовали алгоритмы FastCode
угу, мне интересно, почему StrComp взяли из FastCode, a CompareStr нет, хотя она тоже есть в FastCode.
REA (2007-07-06 10:08:00) [3]В BDS задействовали алгоритмы FastCode
Сергей М. (2007-07-06 08:11:00) [4]
> Seldoff (05.07.07 18:53) [3]
> поправьте если я не прав
Прав, все так и есть на самом деле.
Ну а раз AnsiString содержит служебные поля, то CompareStr использует их для ускорения сравнения в ряде ситуаций с содержимым сравниваемых строк.
Seldoff (2007-07-05 19:28:00) [5]кстати, я говорил о BDS2006, сейчас посмотрел D7 - реализация StrComp отличается. в BDS2006 она более "хитрая".
Seldoff (2007-07-05 18:55:00) [6]в общем если бы я знал ассемблер я бы сам разобрался в отличиях работы, но т.к. я его не знаю :( приходится строить предположения. может кто-нибудь всё-таки переведёт на паскаль?
Seldoff (2007-07-05 18:53:00) [7]
> > код отличается не в плане отличий AnsiString от PChar
> Именно в этом плане и все принципиальные отличия между алгоритмами
> этих функций.
а в чём собственно отличие AnsiString и PChar?
AnsiString - ссылка на массив байт (символов) после которых стоит #0. по отрицательному смещению ещё есть 4 байта счётчика ссылок и 4 байта поля длины.
PChar - ссылка массив байт (символов) после которых стоит #0.
поправьте если я не прав. ну ещё конечно же компилятор сам выделяет\освобождает память для AnsiString, а для PChar нет, но в данном случае это некритично.
> Вот более серьезное различиеStrComp - Note: When working
> with International characters, use AnsiStrComp instead.CompareStr
> - The compare operation is based on the 8-bit ordinal value
> of each character and is not affected by the current locale.
>
и где отличие? CompareStr использует просто код символа для сравнения. StrComp тоже (судя по тому что есть AnsiStrComp, которая учитывает локаль).
Anatoly Podgoretsky (2007-07-05 18:33:00) [8]> Сергей М. (05.07.2007 17:20:01) [1]
Вот более серьезное различие
StrComp - Note: When working with International characters, use AnsiStrComp instead.
CompareStr - The compare operation is based on the 8-bit ordinal value of each character and is not affected by the current locale.
Сергей М. (2007-07-05 17:20:00) [9]
> код отличается не в плане отличий AnsiString от PChar
Именно в этом плане и все принципиальные отличия между алгоритмами этих функций.