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; |
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
Flamefire hat folgendes geschrieben : |
| 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
Flamefire hat folgendes geschrieben : |
| 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] Single.Wert:= 42; |
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] Single.liste[5]:= 42; |
machen?
BTW: was ist wenn ich ein Fuktion mit referenzparameter habe?
wie übergebe ich das?
Yogu - Di 26.05.09 12:42
Flamefire hat folgendes geschrieben : |
| ok also könnte ich: [...] machen? |
Ja. ;)
Flamefire hat folgendes geschrieben : |
| 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
Flamefire hat folgendes geschrieben : |
| 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
Martok hat folgendes geschrieben : |
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 ;)
Martok hat folgendes geschrieben : |
| 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
Flamefire hat folgendes geschrieben : |
| immer das "^" mitschleppen |
muss :mrgreen:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!