Вниз
Скачать: CL | DM;

Прокомментируйте, пожалуйста, код   Найти похожие ветки 

← →
Udjin ©   (2003-09-02 22:02) [0]

type
TAr=array[1..1024] of byte;
Ar=^TAr;
var loop :Integer;
change : boolean;
begin
change := false;
for loop:=1 to SizeOf(r1) do
if Ar(@r1)^[Loop]<>Ar(@r2)^[loop] then
begin
change:=true;
end;
r1 и r2 некоторые записи. Эта штука их сравнивает. Хоть убейте не пойму как. Просветите плз.


← →
Ерш твое имя   (2003-09-02 22:16) [1]

Просто побайтовое сравнение. Записи трактуются, как массивы байт (их приводятся к типизированным указателям), а элементы этих массивов сравниваются в цикле.

Есть недостатки. Во-первых, не хватает Break, поэтому получаем лишнюю работу. Во-вторых, в объявлении TAr лучше поставить packed (на сегодня это все равно, но на будущее лучше подстраховаться). В-третьих, надежно сработает только для packed записей. В-четвертых, не сработает для записей размером более 1024 байт. В-пятых, не сработает для записей разной длины.

А в-шестых, это делается проще и надежнее- надо сравнить размеры записей, и, если они равны, то вызвать CompareMem.


← →
Ерш твое имя   (2003-09-02 22:18) [2]

Слово пропустил:
их адреса приводятся к типизированным указателям


← →
Ерш твое имя   (2003-09-02 22:24) [3]

Еще добавка:
CompareMem тоже сработает только для packed записей.


← →
Юрий Зотов ©   (2003-09-03 06:48) [4]

В общем, да, получилось изобретение велосипеда с квадратными колесами. Потому что то же самое (только быстрее и лучше) делает одна простая строка:
Сhange := not CompareMem(@R1, @R2, SizeOf(R1));



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

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.013 c
1-71662
Vladislav
2003-09-08 16:44
2003.09.22
PDF viewer


1-71648
A-DiL
2003-09-08 22:41
2003.09.22
Количество символов после запятой в Float(Real) переменной


14-71915
Проходий
2003-09-03 09:11
2003.09.22
Ожидание события


1-71716
Kremen
2003-09-10 16:40
2003.09.22
Есть ли функция или оператор для сложения по модулю 2? Подскажите


14-71906
shelest
2003-09-03 13:29
2003.09.22
DOA for Delphi 7




   Наверх