Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Records einfach vergleichen


Tilman - Di 24.01.06 21:26
Titel: Records einfach vergleichen
Wie kann man Records am einfachsten vergleichen


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
type tP = record
  x,y: Integer;
  end;

var a,b: tp;

begin
  if a = b then ShowMessage('klappt');
end;


funktioniert leider nicht. Muss ich sämtliche Felder der Records einzeln vergleichen oder gibt es eine bessere möglichkeit?


Allesquarks - Mi 25.01.06 00:12

Ich würde sagen, dass der Vergleich zweier records oder Objekte nur dann zur Gleichheit führt, wenn das eine durch das andere definiert wurde sie also denselben Speicher belegen. Ansonsten muss man sich eine eigene Vergleichsfunktion schreiben.


Delphi-Quelltext
1:
2:
3:
4:
O1:=Myobjekt.create(Para1,Para2...);
02:=01;

if O2=O1 then //funzt


aber schon


Delphi-Quelltext
1:
2:
3:
4:
O1:=Myobjekt.create(Para1,Para2...);
02:=Myobjekt.create(Para1,Para2...);

if O2=O1 then //sollte schon nicht mehr funktionieren, da zwei unterschiedliche Speicher belegt wurden


Narses - Mi 25.01.06 00:40

Moin!

Du könntest einfach SizeOf(Trecord) Bytes ab der Zeigerposition vergleichen; gab´s da nicht Stringvergleichsfunktionen, die sowas könn(t)en... ? :gruebel:

cu
Narses


Allesquarks - Mi 25.01.06 02:40

Hab ich nicht ausprobiert aber ich würde behaupten, dass sizeof(Trecord) immer 4 Byte zurückgibt (Zeiger). Eine allgemeine Funktion, die beliebige records und Objekte vergleicht ist sowieso nicht möglich ohne individuellen Code, der die spezifischen Objekte verarbeitet. Andernfalls müsste man zu jedem Objekt eine Laufzeit Dokumentation bereithalten. Soweit ich weiß geht die RTTI nicht soweit. Deshalb: Eigene Vergleichsfunktion implementieren.

Das mit dem Sizeof(record) funktioniert vielleicht mit packed Objekten. Will mich aber auch nicht zu weit aus dem Fenster lehnen.


BenBE - Mi 25.01.06 21:08

user profile iconNarses hat folgendes geschrieben:
Moin!

Du könntest einfach SizeOf(Trecord) Bytes ab der Zeigerposition vergleichen; gab´s da nicht Stringvergleichsfunktionen, die sowas könn(t)en... ? :gruebel:

cu
Narses

Ja, das geht. Funktion nennt sich CompareMem.

user profile iconAllesquarks hat folgendes geschrieben:
Hab ich nicht ausprobiert aber ich würde behaupten, dass sizeof(Trecord) immer 4 Byte zurückgibt (Zeiger).

Records sind für Delphi keine Zeiger im eigentlichen Sinne. Delphi arbeitet nur meist mit einem Zeiger auf die Daten, da Records in kein Register passen und Records "Masken" darstellen, um auf diese Daten zuzugreifen.

SizeOf(TRecord) liefert die Größe (des größten Teilzweigs) eines Records zurück.

user profile iconAllesquarks hat folgendes geschrieben:
Eine allgemeine Funktion, die beliebige records und Objekte vergleicht ist sowieso nicht möglich ohne individuellen Code, der die spezifischen Objekte verarbeitet.

Da geb ich dir insofern Recht, als dass CompareMem nur für Records ohne Strings, Arrays oder anderer dynamisch verwalteter Objects zuverlässig funktioniert.

user profile iconAllesquarks hat folgendes geschrieben:
Andernfalls müsste man zu jedem Objekt eine Laufzeit Dokumentation bereithalten. Soweit ich weiß geht die RTTI nicht soweit. Deshalb: Eigene Vergleichsfunktion implementieren.
Das ist einer der wenigen Sprachvorteile von Java, auch wenn die RTL kacke ist ...

user profile iconAllesquarks hat folgendes geschrieben:
Das mit dem Sizeof(record) funktioniert vielleicht mit packed Objekten. Will mich aber auch nicht zu weit aus dem Fenster lehnen.

Siehe Kommentar oben von mir ...


Tilman - Do 26.01.06 00:12

Danke an alle, CompareMem werd ich mal ausprobieren, habe es aber inzwischen so realisiert das ich einfach alle Felder in einer IF-Anweisung mit vielen ANDs vergleiche. Nicht schön, funktioniert aber.