Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Record zuweisung


Flamefire - Mo 25.05.09 21:54
Titel: Record zuweisung
Hallo

ich habe einen Typ definiert:

Delphi-Quelltext
1:
2:
3:
4:
type TTest=record
feld:array of Byte;
a,b:Integer;
end;


Was passiert wenn ich jetzt das hier habe:

Delphi-Quelltext
1:
2:
3:
4:
5:
t1,t2:TTest;
//....
t1.//....
//...
t2:=t1; //HIER


Wird bei der Zuweisung lediglich der Pointer kopiert und alle Modifikationen auf t2 wirken sich unmittelbar auf t1 aus oder wird die komplette Struktur kopiert.
Falls ja, ich möchte nur den Pointer kopieren und nicht die ganze struktur, da t1 im original ein array of TTest ist und ich t2 nur als abkürzung verwenden möchte


Xentar - Mo 25.05.09 21:59

Soweit ich weiß wird bei nem record der Inhalt kopiert, und bei ner Klasse nur der Pointer.

Du kannst jedoch einen weiteren Typ, PTest = ^TTest definieren, und mit diesem dann hantieren.


Flamefire - Mo 25.05.09 22:05

hatte ich auch erst gedacht...dann muss ich aber immer das "^" mitschleppen


Kha - Mo 25.05.09 22:46

Entweder ^ benutzen oder TTest als Klasse implementieren, einen Tod musst du sterben ;) .
Wobei du auch erst t2 bearbeiten und am Schluss wieder ins Array übertragen könntest.


Yogu - Mo 25.05.09 23:09

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
dann muss ich aber immer das "^" mitschleppen

Naja, so viel Aufwand ist das gar nicht. Du muss nur überall statt TTest PTest verwenden, und bei direkten Zuweisungen eben das ^ hinten anhängen. Aber um auf Felder zugreifen zu können, ist das ^ nicht erforderlich:


Delphi-Quelltext
1:
2:
3:
4:
5:
var Test: PTest;
begin
  Test.a := 1;
  Test.b := 5;
end;


Martok - Mo 25.05.09 23:12

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
hatte ich auch erst gedacht...dann muss ich aber immer das "^" mitschleppen

Nein. Das dereferenzieren macht Delphi selber:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  List: array of TMyRec;
  Single: PMyRec;
begin
  Single:= @List[0// ersten Eintrag...
  Single.Wert:= 42// ...manipulieren


EDIT: warum genau gabs Yogus Post jetzt nicht in orange? Naja, hast du halt 2 Beispiele ;)


Flamefire - Di 26.05.09 07:12

ok also könnte ich:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  List: array of TMyRec;
  Single: PMyRec;
begin
  Single:= @List[0// ersten Eintrag...
  Single.liste[5]:= 42// ...manipulieren


machen?

BTW: was ist wenn ich ein Fuktion mit referenzparameter habe?
wie übergebe ich das?


Yogu - Di 26.05.09 12:42

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
ok also könnte ich: [...] machen?

Ja. ;)

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
was ist wenn ich ein Fuktion mit referenzparameter habe? wie übergebe ich das?

Wenn du eine solche Prozedur hast:


Delphi-Quelltext
1:
2:
3:
4:
procedure Foo(var Rec: TMyRec);
begin
  Rec.b := 7;
end;

Dann kannst du IMHO den Aufruf so gestalten:


Delphi-Quelltext
1:
2:
3:
4:
5:
var Single: PMyRec;
begin
  Single := New(PMyRec);
  Foo(Single^);
end;

Das gleiche gilt selbstverständlich auch für const- und out-Parameter (vorausgesetzt, es geht mit var ;)).


Martok - Di 26.05.09 16:02

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
was ist wenn ich ein Fuktion mit referenzparameter habe? wie übergebe ich das?

Wenn es ein Var- oder Out-Parameter ist, kannst du das auch so machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure Foo(const Rec: PMyRec);
begin
  Rec.b := 7;
end;

var Single: PMyRec;
begin
  Single := New(PMyRec);
  Foo(Single);
end;

Warum? Weil Var-Parameter nichts anderes sind als Pointer, dann kann man die auch gleich so übergeben ;)


Yogu - Di 26.05.09 17:36

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure Foo(const Rec: PMyRec);
begin
  Rec.b := 7;
end;

var Single: PMyRec;
begin
  Single := New(PMyRec);
  Foo(Single);
end;

Das ist jetzt doch Blödsinn: Hier übergibst du einen Zeiger zum Zeiger, wie du drunter ja schon angedeutet hast. Lass das const vor dem Parameter weg, dann stimmt's wieder ;)

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Warum? Weil Var-Parameter nichts anderes sind als Pointer, dann kann man die auch gleich so übergeben ;)

Richtig, aber wenn die Funktionsdeklaration schon feststeht, und da eben ein const steht. Außerdem ist es manchmal schöner, weil man eben nicht
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
immer das "^" mitschleppen
muss :mrgreen: