Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mo 25.05.09 21:54 
Hallo

ich habe einen Typ definiert:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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.

_________________
PROGRAMMER: A device for converting coffee into software.
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mo 25.05.09 22:05 
hatte ich auch erst gedacht...dann muss ich aber immer das "^" mitschleppen
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var Test: PTest;
begin
  Test.a := 1;
  Test.b := 5;
end;
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:
ausblenden 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 ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 26.05.09 07:12 
ok also könnte ich:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:

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

Dann kannst du IMHO den Aufruf so gestalten:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:
ausblenden 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 ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 26.05.09 17:36 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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: