Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Как сравнить две переменные типа record?

#delphi


type cl = record
  r,g,b:byte;
end;

var cl1,cl2:cl;
begin

if cl1<>cl2 then ...  //operator not applicable to this operand type
    


Ответы

Ответ 1



Может так сравнишь рекордные переменные... if (cl1.r=cl2.r) and (cl1.g=cl2.g) and (cl1.b=cl2.b) then ... else ... {пиши код свой, если переменные не идентичны}

Ответ 2



С помощью определения операторов сравнения. RTFM Operator Overloading. См. пример как раз с цветом Delphi operator overloading ЗЫ Доступно в Delphi старше 7й версии. ЗЗЫ Тут список нововведений по сравнению с D7.

Ответ 3



type cl = record r,g,b:byte; class operator Equal(a, b: cl): Boolean; end; { ... } class operator cl.Equal(a, b: cl): Boolean; begin Result := (a.r = b.r) and (a.g = b.g) and (a.b = b.b); end; (страшенный стиль кода - авторская копипаста)

Ответ 4



Подход @integralal - сравнение по полям - правильный. Если хочется этого избежать, можно сравнивать массивы байтов функцией CompareMem, предварительно объявив записи как packed. var p1, p2 : PSomeRecord; begin New(p1); New(p2); try if CompareMem(p1, p2, Sizeof(p1^)) then {...}; finally Dispose(p1); Dispose(p2); end; end; Чтобы метод работал, записи должны плотно упаковываться и не содержать указателей. Вообще метод небезопасный.

Ответ 5



Сравнение таких переменных как правило зависит от бизнес логики, только при полном равенстве всех полей можно утверждать, что они равны, иначе надо следовать некой бизнес-логике. Приведите пожалуйста бизнес-логику вашего конкретного случая. Если как догадались другие участники это сравнение двух цветов тогда проще всего наверно сделать процедуру function compareRGB(color1,color2:cl):boolean; begin if color1.r=color2.r and color1.g=color2.g and color1.b=color2.b then result := true else result := false; end;

Ответ 6



function IsEqual(a,b:C1): Boolean; begin Result:=(a.r=b.r) and (a.g=b.g) and (a.b=b.b); end;

Ответ 7



В Delphi 2006 и выше есть перегрузка операторов для рекордов: TKMPoint = record X,Y: Integer; public class operator Equal(const A, B: TKMPoint): Boolean; class operator NotEqual(const A, B: TKMPoint): Boolean; end; ......... class operator TKMPoint.Equal(const A, B: TKMPoint): Boolean; begin Result := (A.X = B.X) and (A.Y = B.Y); end; class operator TKMPoint.NotEqual(const A, B: TKMPoint): Boolean; begin Result := (A.X <> B.X) or (A.Y <> B.Y); end; ........ var A, B: TKMPoint; begin A := TKMPoint.New(1, 1); B := TKMPoint.New(1, 1); Assert(A = B); B := TKMPoint.New(2, 2); Assert(A <> B); end; Список операторов для переопределения: Operator Overloading (Delphi)

Комментариев нет:

Отправить комментарий