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 |
aber schon
Delphi-Quelltext
1: 2: 3: 4:
| O1:=Myobjekt.create(Para1,Para2...); 02:=Myobjekt.create(Para1,Para2...);
if O2=O1 then |
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
Narses 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.
Allesquarks 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.
Allesquarks 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.
Allesquarks 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 ...
Allesquarks 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!