Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Dynamische Arrays...Übergabe
Flamefire - Fr 10.07.09 12:16
Titel: Dynamische Arrays...Übergabe
Ich habe folgende Situation:
Eine funktion liefert als RückgabeTyp ein dynamisches ByteArray
Delphi-Quelltext
1: 2: 3: 4:
| function foo():TDynByteArray; begin SetLength(Result,100); end; |
das weise ich einer variable zu:
was passiert jetzt, wenn ich nochmal
temp:=foo(); mache?
hab ich dann das vorherige array verloren (memleak?)
und was ist mit:
Delphi-Quelltext
1: 2:
| temp:=foo(); temp2:=temp; |
habe ich dann 2 mal den speicher des arrays, oder sind temp und temp2 nur pointer auf das array und nur der pointer wurde kopiert?
bummi - Fr 10.07.09 16:08
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var a,b:TDynIntArray; begin a := foo; a[10]:=10; b:=a; SetLength(b,0); Showmessage(IntToStr(a[10])); Showmessage(IntToStr(High(b))); Showmessage(IntToStr(High(a))); end; |
bissel so wie bei Strings ....
Moderiert von
Gausi: Delphi-Tags hinzugefügt
Marc. - Fr 10.07.09 17:00
Kleines Beispiel, hoffe dass ich mich hierbei nun nicht vertan habe. ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| type TDynArray = Array of Integer;
function Foo(ALength: Integer): TDynArray; begin SetLength(Result, ALength); end;
procedure Demo; var dA: TDynArray; p: Pointer; begin dA := Foo(150); Pointer(TDynArray(p)) := @(TDynArray(dA)); dA := Foo(100); ShowMessage(IntToStr(Length(TDynArray(p^)))); TDynArray(p^)[150] := 2;
ShowMessage(IntToStr(DWORD(p^))); ShowMessage(IntToStr(TDynArray(Pointer(DWORD(10530968)))[150])); ShowMessage(IntToStr(dA[150])); end; |
Edit: Ich muss zugeben, dass die Spielerei mit den Pointern im Grunde redundant ist... :P
Grüße,
Marc
BenBE - Fr 10.07.09 17:18
Marc. hat folgendes geschrieben : |
Kleines Beispiel, hoffe dass ich mich hierbei nun nicht vertan habe. ;)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| type TDynArray = Array of Integer;
function Foo(ALength: Integer): TDynArray; begin SetLength(Result, ALength); end;
procedure Demo; var dA: TDynArray; p: Pointer; begin dA := Foo(150); p := @dA; dA := Foo(100); ShowMessage(IntToStr(Length(TDynArray(p^)))); TDynArray(p^)[150] := 2; ShowMessage(IntToStr(DWORD(p^))); ShowMessage(IntToStr(TDynArray(Pointer(DWORD(10530968)))[150])); ShowMessage(IntToStr(dA[150])); end; |
Edit: Ich muss zugeben, dass die Spielerei mit den Pointern im Grunde redundant ist... :P
Grüße,
Marc |
*Die Adresse eines Zeigers bekommt man mit DWORD(p) und nicht DWORD(p^). Letzteres ist der Wert der Speicherzelle, auf die der Zeiger zeigt als DWORD interpretiert.
Flamefire - Fr 10.07.09 17:50
also kurz: bei der neuen zuweisung eines arrays wird nur der pointer überschrieben. ich muss das alte array also vorher freigeben...
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!