Главная страница
    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.47 MB
Время: 0.033 c
4-1175752393
аыпвапы
2007-04-05 09:53
2007.10.07
Alt+Tab как запретить в ХР?


3-1180590365
MZ
2007-05-31 09:46
2007.10.07
Импорт из DBF в FireBird


2-1189420317
Nikola62
2007-09-10 14:31
2007.10.07
Как не дать форме открыться


15-1188978747
Nic
2007-09-05 11:52
2007.10.07
Настройка web - сервака: ещё пара вопросов


1-1185652576
click
2007-07-28 23:56
2007.10.07
плавный скроллинг TScrollBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский