Autor Beitrag
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 24.01.06 21:26 
Wie kann man Records am einfachsten vergleichen

ausblenden 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?

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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.

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

if O2=O1 then //funzt


aber schon

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Tilman Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)