Форум: "Потрепаться";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
ВнизПрокомментируйте, пожалуйста, код Найти похожие ветки
← →
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 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.012 c