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

Вниз

Как сравнить два 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.38 c
15-1189498608
PEAKTOP
2007-09-11 12:16
2007.10.07
Математическое программирование


6-1170949405
AllDontFire
2007-02-08 18:43
2007.10.07
Как реализовать 3х уровневое приложение?


2-1189446472
integery
2007-09-10 21:47
2007.10.07
Подскажите алгоритм генерации текста


2-1189331798
zzz0001
2007-09-09 13:56
2007.10.07
В ЧЕМ ОШИБКА???


2-1189590604
Emelinn
2007-09-12 13:50
2007.10.07
Cоединение с MS SQL server