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

Вниз

CompareMem   Найти похожие ветки 

 
Sha ©   (2006-12-14 01:16) [40]

вернее места, где он лежит


 
Rouse_ ©   (2006-12-14 01:25) [41]

Sha, понял, но левее 8 байт то всеравно лежит...


 
Sha ©   (2006-12-14 01:26) [42]

И левее, и правее, но к строке они не имеют никакого отношения...


 
Германн ©   (2006-12-14 01:56) [43]


> Rouse_ ©   (14.12.06 00:07) [16]
>
> Ииии, хорошь ругаца :))
> Вопрос в чем, какого спрашивается функция возвращает TRUE
> если она не произвера сравнение данных (не произвела однозначно,
>  т.к. тест на длинну данных ни там ни ниже нет)
>

Сань, хорош баламутить. Как можно однозначно выбрать "да" или "нет" в случае отсутствия данных? ЮЗ предложил наиболее грамотный совет. Использовать три состояния в ответе.
Все прочие рассуждения ориентированы на конкретные задачи. Имхо.


 
Германн ©   (2006-12-14 02:24) [44]

Я промахнулся :(
Прошу меня извинить.
Ориентировался я на
> Rouse_ ©   (13.12.06 23:38) [1]
>
> Мы просто сегодня с jack128 по этой теме что-то заспорили.
> ..
> Его логика - данные равны даже если их размер нулевой.
> Моя логика - если размер нулевой, то данных то собственно
> и нет, поэтому результат должен вернуться False т.к. сравнивать
> нечего...
>


 
Anatoly Podgoretsky ©   (2006-12-14 09:03) [45]

> Rouse_  (14.12.2006 01:25:41)  [41]

Поспать не пора?
А то стыдно :-)

На всякий случай маленький ликбез по длинным строкам.

Переменная типа string указывает на первый байт строки, если только строка не пустая, тогда значение указателя равно nil

Если не пустая, то указатель на первый байт строки, а по смещению -4 лежит длина этой строки и по смещению -8 счетчик ссылок, в более старых версиях был еще один член, по смещению -12 было значение зарезервированого количества бай, но в коде не использовалось. То есть указатель это по сути указатель на структуру

 
           RefCount: Integer
           Length: Integer
string --> PChar: array [1..Length] of char + #0
 

При изменении строки, если будет создана копия, то создается новый экземпляр и изменяется переменная string, для того экземпляра, который создается, у остальных экземляров уменьшается счетчик и если он равен нулю, то память освобождается, а переменным присваивается nil


 
Anatoly Podgoretsky ©   (2006-12-14 09:03) [46]

Удалено модератором


 
Anatoly Podgoretsky ©   (2006-12-14 09:09) [47]

> Anatoly Podgoretsky  (14.12.2006 09:03:45)  [45]

Для совместимости с WinAPi - если передается строка через приведение к PChar, то в при пустой строке передается указатель на внутренний буфер array[0..0] of char, который содержит только символ #0 и что очень важно, данная память Read Only, на этом многие прокалываются, когда передают указатель в WinAPI

Пример неправильной работы

S := "";
CharToOem(PChar(S), PChar(S));

А вот пример правильной работы

S := "";
if S <> "" then CharToOem(PChar(S), PChar(S));


 
pasha_golub ©   (2006-12-14 10:19) [48]


> Anatoly Podgoretsky ©   (14.12.06 09:03) [46]
>
> Удалено модератором

Сам пью, сам гуляю? :))


 
Sha ©   (2006-12-14 11:01) [49]

> Anatoly Podgoretsky ©   (14.12.06 09:09) [47]

> А вот пример правильной работы
> S := "";
> if S <> "" then CharToOem(PChar(S), PChar(S));

Это был хитрый пример не всегда правильной работы :)

Можете проверить на этом коде:

 s:="123";
 if s<>"" then CharToOem(PChar(S), PChar(S));


А вот как надо :)

 s:="123";
 UniqueString(s);
 if s<>"" then CharToOem(pointer(S), pointer(S));


 
Vga ©   (2006-12-14 13:23) [50]

> [49] Sha ©   (14.12.06 11:01)
> UniqueString(s);

А что эта функция делает? Создает копию строки?


 
jack128 ©   (2006-12-14 13:46) [51]

Vga ©   (14.12.06 13:23) [50]
да. Создает реальную копию, а не просто увеличивает счетчик ссылок..


 
Sha ©   (2006-12-14 13:49) [52]

Создает копию неуникальной строки.
Если строка уникальна (счетчик ссылок равен 1), то она ничего не делает.


 
Sha ©   (2006-12-14 13:52) [53]

Ну и, разумеется, пустая строка при этом не расщепляется, т.к. расщеплять нечего.
Т.е. все пустые строки считаются уникальными.


 
Anatoly Podgoretsky ©   (2006-12-14 14:00) [54]

> pasha_golub  (14.12.2006 10:19:48)  [48]

А что, разве неприкасаемый?
Это бул дубль


 
Anatoly Podgoretsky ©   (2006-12-14 14:02) [55]

> Sha  (14.12.2006 11:01:49)  [49]

Не спорю, я вообще то говорил об другом варианте, когда строка не константа, а например считывается с файла, но это тоже пример неправильной работе, при том же при по той же самой причине - константная строка.


 
Юрий Зотов ©   (2006-12-14 15:54) [56]

> Rouse_ ©   (13.12.06 23:53) [11]

Саш, как видишь, даже такая простая и чисто компьютерная задача - и то уже не укладывается в рамки "ать-два" (т.е., "ноль-единица"). Что уж тогда говорить о задачах, вытекающих из жизни?

"Век лампочек" не пройдет никогда, Саш. Потому что он вовсе не век.
:о)


 
Eraser ©   (2006-12-14 20:15) [57]

кстати по-поводу сабжа, winAPI возвращает true, даже если строки пустые, но при этом указывает соответствующую ошибку, которую можно получить через getlasterror.


 
Mystic ©   (2006-12-14 21:05) [58]

Определение:
 Два блока памяти равны, (а) у них совпадает длина N(б) если не существует такого номера i, (0 <= i <= N), что i-й байт первого блока отличается от i-го байта второго блока.

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

Из этого определения видно, что два пустых блока равны между собой. Более того, при таком определении равенства блоков, функция CompareMem является отношением эквивалентности, что является полезным свойством.


 
default ©   (2006-12-14 21:48) [59]

давайте ещё поспорьте правильно-ли, что любое число в нулевой степени это 1, что факториал нуля единица, ...

такие вопросы решаются или в пользу удобства, или в пользу того, что более очевидно, в пользу...



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

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

Наверх




Память: 0.58 MB
Время: 0.028 c
2-1166174996
HAtCH
2006-12-15 12:29
2007.01.07
Отличия Owner и Self


2-1166452299
i-am-vladko
2006-12-18 17:31
2007.01.07
Image на компоненте


15-1166007001
alucard
2006-12-13 13:50
2007.01.07
Управление NT4 сервером.


2-1166376380
Ricks
2006-12-17 20:26
2007.01.07
Регистрация файла


4-1154781641
fufel
2006-08-05 16:40
2007.01.07
drag i drop | delphi i iexplorer