Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сравнить два GUID? [D7, XP]


Darvin ©   (2007-09-12 13:37:00) 

Здравствуйте.
Как можно выполнить следующее:

var
 G1, G2 : TGUID;

begin
 ...
 if G1 = G2 then ...  
<- Ошибка несовместимости типов

Ошибка понятна TGUID - структура, а их сравнивать нельзя.
Я вышел из положения следующим способом:
  if GUIDToString(G1) = GUIDToString(G2) then ...
Но корректно ли так сравнивать два GUID?


Ega23   (2007-09-12 14:37:00) [1]


> Сергей М. ©   (12.09.07 14:32) [10]


Спасибо за пояснения. Возьму на вооружение.


Darvin   (2007-09-12 14:34:00) [2]

>Сергей М. ©   (12.09.07 14:32) [10]
ясно, учту, спасибо


Сергей М.   (2007-09-12 14:32:00) [3]

С т.з. генерируемого компилятором машкода мой код приводит максимум к 4-м операциям сравнения при незначительных накл.расходах на подготовку к этим сравнениям.

CompareMem использует строковую инструкцию rep cmpsd, которая тоже не менее эффективна, но накл.расходы на подготовку к выполнению этой инструкции сводят на нет ее преимущества - любая "универсальность" (а ф-ция CompareMem реализована как универсальная для любых типов данных любого размера) часто, если не сказать всегда, наносит ущерб эффективности в конкретном ее применении.


Darvin   (2007-09-12 14:26:00) [4]

Я пока остановился на варианте [3], учитывая критерий оптимальность / простота кода, но проверить пока не могу, проект не компилится по не связанным с сабжем причинам. Доработаю, буду пробовать.


Ega23   (2007-09-12 14:16:00) [5]


> Я лишь предложил один из возможных вариантов с т.з. простоты
> и эффективности.


Не, просто как-то понадобилось их (ГУИДы) сравнивать, причём не на TSQL (там проще). Тогда мне показалось, что данный способ [3] наиболее быстр, чем распихивать ГУИД по его структуре и сравнивать отдельные поля.

Поправь меня, если я не прав.


Сергей М.   (2007-09-12 14:09:00) [6]


> Ega23 ©   (12.09.07 14:01) [6]


А я про проблемы и не говорил.
Я лишь предложил один из возможных вариантов с т.з. простоты и эффективности.


Ega23   (2007-09-12 14:01:00) [7]


> Сергей М. ©   (12.09.07 13:59) [5]


а как в [3] - разве могут проблемы возникнуть?


Сергей М.   (2007-09-12 13:59:00) [8]


> корректно ли так сравнивать два 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, если равны


Darvin   (2007-09-12 13:46:00) [9]

всем спасибо!


Ega23   (2007-09-12 13:43:00) [10]


function  GuidCompare(Val1, Val2: TGUID): Boolean;
begin
 Result := CompareMem(@Val1, @Val2, SizeOf(TGUID));
end;


clickmaker   (2007-09-12 13:42:00) [11]

ну для надежности можно там
if SameText(G1, G2) then ...
но сравнивать строки всегда дольше
можно написать свою, сравнивать поля структуры
или IsEqualGUID из ole32


Вася Правильный   (2007-09-12 13:39:00) [12]

если структура, что мешает сравнить ее попольно?
и следать для этогофункцию при многоразовом использовании


Наверх

Титульная страница Поиск, карта сайта Написать письмо