Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
ВнизКак сравнить два GUID? Найти похожие ветки
← →
Darvin © (2007-09-12 13:37) [0]Здравствуйте.
Как можно выполнить следующее:var
<- Ошибка несовместимости типов
G1, G2 : TGUID;
begin
...
if G1 = G2 then ...
Ошибка понятна TGUID - структура, а их сравнивать нельзя.
Я вышел из положения следующим способом:
if GUIDToString(G1) = GUIDToString(G2) then ...
Но корректно ли так сравнивать два GUID?
← →
Вася Правильный (2007-09-12 13:39) [1]если структура, что мешает сравнить ее попольно?
и следать для этогофункцию при многоразовом использовании
← →
clickmaker © (2007-09-12 13:42) [2]ну для надежности можно там
if SameText(G1, G2) then ...
но сравнивать строки всегда дольше
можно написать свою, сравнивать поля структуры
или IsEqualGUID из ole32
← →
Ega23 © (2007-09-12 13:43) [3]
function GuidCompare(Val1, Val2: TGUID): Boolean;
begin
Result := CompareMem(@Val1, @Val2, SizeOf(TGUID));
end;
← →
Darvin © (2007-09-12 13:46) [4]всем спасибо!
← →
Сергей М. © (2007-09-12 13:59) [5]
> корректно ли так сравнивать два GUID?
Корректно, но в ряде случаев неэффективно.
Как вариант можно поступить так:
type
TGUIDStruct = packed record
case Integer of
0: (Native: TGUID);
1: (Int64Array: array[0..1] of Int64);
end;
var
G1, G2 : TGUID;
G1s: TGUIDStruct absolute G1;
G2s: TGUIDStruct absolute G2;
..
Result := (G1s.Int64Array[0] = G2s.Int64Array[0]) and (G1s.Int64Array[1] = G2s.Int64Array[1]); //True, если равны
← →
Ega23 © (2007-09-12 14:01) [6]
> Сергей М. © (12.09.07 13:59) [5]
а как в [3] - разве могут проблемы возникнуть?
← →
Сергей М. © (2007-09-12 14:09) [7]
> Ega23 © (12.09.07 14:01) [6]
А я про проблемы и не говорил.
Я лишь предложил один из возможных вариантов с т.з. простоты и эффективности.
← →
Ega23 © (2007-09-12 14:16) [8]
> Я лишь предложил один из возможных вариантов с т.з. простоты
> и эффективности.
Не, просто как-то понадобилось их (ГУИДы) сравнивать, причём не на TSQL (там проще). Тогда мне показалось, что данный способ [3] наиболее быстр, чем распихивать ГУИД по его структуре и сравнивать отдельные поля.
Поправь меня, если я не прав.
← →
Darvin © (2007-09-12 14:26) [9]Я пока остановился на варианте [3], учитывая критерий оптимальность / простота кода, но проверить пока не могу, проект не компилится по не связанным с сабжем причинам. Доработаю, буду пробовать.
← →
Сергей М. © (2007-09-12 14:32) [10]С т.з. генерируемого компилятором машкода мой код приводит максимум к 4-м операциям сравнения при незначительных накл.расходах на подготовку к этим сравнениям.
CompareMem использует строковую инструкцию rep cmpsd, которая тоже не менее эффективна, но накл.расходы на подготовку к выполнению этой инструкции сводят на нет ее преимущества - любая "универсальность" (а ф-ция CompareMem реализована как универсальная для любых типов данных любого размера) часто, если не сказать всегда, наносит ущерб эффективности в конкретном ее применении.
← →
Darvin © (2007-09-12 14:34) [11]>Сергей М. © (12.09.07 14:32) [10]
ясно, учту, спасибо
← →
Ega23 © (2007-09-12 14:37) [12]
> Сергей М. © (12.09.07 14:32) [10]
Спасибо за пояснения. Возьму на вооружение.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.048 c