Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1175630984
LuceferAB
2007-04-04 00:09
2007.10.07
как показать форму не отбирая фокуса


1-1185183848
Tack
2007-07-23 13:44
2007.10.07
Проверить файл при открытии контекстного меню проводника


15-1189424595
MZ
2007-09-10 15:43
2007.10.07
Управление пользователями FireBird


2-1189342976
lllll00
2007-09-09 17:02
2007.10.07
в чем ошибка


15-1189361532
редкий гость
2007-09-09 22:12
2007.10.07
Java script





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский