Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pointer auf dynamisches Array (https://www.delphipraxis.net/82657-pointer-auf-dynamisches-array.html)

Flips 17. Dez 2006 14:39


Pointer auf dynamisches Array
 
Hi.

Habe folgendes Problem und folgenden Code:
Delphi-Quellcode:
type MyRec = record
  feld1 : integer;
  feld2 : TColor;
end;

type TMyRecArray = array of MyRec;
     PMyRecArray = ^MyRecArray;

var PointerAufDasArray: PMyRecArray;
[...]
SetLength(PointerAufDasArray^,10);
Sobald der Ablauf bei SetLength angelangt ist geht gar nichts mehr.
Mache ich es so, dann gehts(sehr unschön :-/ ):
Delphi-Quellcode:
var
  NormaleVariable   : TMyRecArray;
  PointerAufDasArray : PMyRecArray;
[...]
SetLength(NormaleVariable,10);
PointerAufDasArray := @NormaleVariable;
Wieso geht die erste Möglichkeit nicht???

MfG
Flips

3_of_8 17. Dez 2006 14:42

Re: Pointer auf dynamisches Array
 
Probiers mal mit nem untypisierten Pointer und einem anschließenden Cast auf deinen Array-Typ.

r2c2 17. Dez 2006 14:51

Re: Pointer auf dynamisches Array
 
Gibt es überhaupt einen Grund, warum du n Pointer auf n dyn. Array haben willst? N dyn. Array is nämlich schon n Pointer, du hast also n Pointer auf n Pointer auf n Array...

mfg

Christian

Dax 17. Dez 2006 14:54

Re: Pointer auf dynamisches Array
 
Delphi-Quellcode:
type MyRec = record
  feld1 : integer;
  feld2 : TColor;
end;

type TMyRecArray = array of MyRec;
     PMyRecArray = ^MyRecArray;

var PointerAufDasArray: PMyRecArray;
New(PointerAufDasArray);
SetLength(PointerAufDasArray^,10);
Müsste so gehen. Aber wie gesagt unnötig, da ein dynamisches Array nur ein Pointer auf das erste Element eines "statischen" Arrays ist.

Neutral General 17. Dez 2006 14:56

Re: Pointer auf dynamisches Array
 
Delphi-Quellcode:
type MyRec = record
  feld1 : integer;
  feld2 : TColor;
end;

type TMyRecArray = array of MyRec;
     PMyRecArray = ^MyRecArray;

var PointerAufDasArray: PMyRecArray;
[...]
SetLength(PointerAufDasArray^,10);
Ich weiß zwar nicht ob dus nicht nur vergessen hast hinzuschreiben... Aber wenn du dir nur ne PMyRecArray Variable machst und dann das Array mit SetLength verändern willst.... ehm welches Array?
Ist der Pointer nicht vielleicht noch nil? Weil dann is das ja kein Wunder.. Wenn der Pointer auf kein Array zeigt kannste da auch nix mit SetLength machen^^

Flips 17. Dez 2006 14:59

Re: Pointer auf dynamisches Array
 
Danke für die schnelle Antwort, ich hoffe ich habs richtig verstanden.

Wenn ich das ganze so mache:
Delphi-Quellcode:
var
  MyPointer : Pointer;
[...]
New(MyPointer)
SetLength(PMyRecArray(MyPointer)^,10);
MyPointer := nil;
Dispose(MyPointer);
Dann hat es den selben Effekt.

@r2c2:
Mhhh das ein dyn. Array sowieso schon ein Pointer ist wusst ich nicht :oops:
Ich dachte mir nur das ich mit Pointern arbeiten soll weil das schon große Arrays werden und ich die Performance brauch und weil ich gehört habe, dass das Arbeiten mit Pointern schneller sein soll.
@Dax: Mom ich teste mal^^

Schreibt doch ma ned so schnell, immer wenn ich meinen post abschicken will werd ich drauf aufmerksam gemacht, dass es wieder neue gibt :-D

Flips 17. Dez 2006 15:02

Re: Pointer auf dynamisches Array
 
Ok, nachdem der Code von Dax geht (dankeschön) und ihr mich netterweise über dynamische Arrays aufgeklärt habt, löse ich nun mein Problem in dem ich ganz normal das dynamische Array benutze.
Wiedermal was gelernt :lol: :dp:

MisterNiceGuy 13. Jan 2010 23:47

Re: Pointer auf dynamisches Array
 
Wie greife ich denn dann hier auf ein Element des Arrays zu?

himitsu 14. Jan 2010 08:40

Re: Pointer auf dynamisches Array
 
Wie schon gesagt wurde ... wozu soll sowas gut sein?

Ein dynamisches Array ist schon ein Pointer.

Delphi-Quellcode:
var
  MyPointer : Pointer;

New(MyPointer)
...
SetLength(PMyRecArray(MyPointer)^, 10);
PMyRecArray(MyPointer)^[i]
...
// MyPointer := nil; // hier hatte Flips ein Speicherleck erzeugt
PMyRecArray(MyPointer)^ := nil;           // so Richtig
// SetLength(PMyRecArray(MyPointer)^, 0); // oder so
Dispose(MyPointer);
oder
Delphi-Quellcode:
var
  MyPointer : PMyRecArray;

New(MyPointer)
...
SetLength(MyPointer^, 10);
MyPointer^[i]
...
// MyPointer := nil; // hier hatte Flips ein Speicherleck erzeugt
MyPointer^ := nil;           // so Richtig
// SetLength(MyPointer^, 0); // oder so
Dispose(MyPointer);
wobei ich es maximal so machen würde
Delphi-Quellcode:
type TMyArray = array of irgendwas;
   PMyArray = ^TMyArray;

var MyArr : TMyArray;

var MyArrPointer : PMyArray;

MyArrPointer := @MyArr;

SetLength(MyArrPointer^, 10);
MyArrPointer^[i]

MisterNiceGuy 14. Jan 2010 11:57

Re: Pointer auf dynamisches Array
 
Okay, das versteh ich, aber warum geht dann folgendes nicht?

Delphi-Quellcode:
length(PDynArray(MyPointer)^);
Ich bekomm jedesmal eine Zugriffsverletzung wenn ich mir die Länge ausgeben lassen will.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz