![]() |
Pointer auf dynamisches Array
Hi.
Habe folgendes Problem und folgenden Code:
Delphi-Quellcode:
Sobald der Ablauf bei SetLength angelangt ist geht gar nichts mehr.
type MyRec = record
feld1 : integer; feld2 : TColor; end; type TMyRecArray = array of MyRec; PMyRecArray = ^MyRecArray; var PointerAufDasArray: PMyRecArray; [...] SetLength(PointerAufDasArray^,10); Mache ich es so, dann gehts(sehr unschön :-/ ):
Delphi-Quellcode:
Wieso geht die erste Möglichkeit nicht???
var
NormaleVariable : TMyRecArray; PointerAufDasArray : PMyRecArray; [...] SetLength(NormaleVariable,10); PointerAufDasArray := @NormaleVariable; MfG Flips |
Re: Pointer auf dynamisches Array
Probiers mal mit nem untypisierten Pointer und einem anschließenden Cast auf deinen Array-Typ.
|
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 |
Re: Pointer auf dynamisches Array
Delphi-Quellcode:
Müsste so gehen. Aber wie gesagt unnötig, da ein dynamisches Array nur ein Pointer auf das erste Element eines "statischen" Arrays ist.
type MyRec = record
feld1 : integer; feld2 : TColor; end; type TMyRecArray = array of MyRec; PMyRecArray = ^MyRecArray; var PointerAufDasArray: PMyRecArray; New(PointerAufDasArray); SetLength(PointerAufDasArray^,10); |
Re: Pointer auf dynamisches Array
Delphi-Quellcode:
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?
type MyRec = record
feld1 : integer; feld2 : TColor; end; type TMyRecArray = array of MyRec; PMyRecArray = ^MyRecArray; var PointerAufDasArray: PMyRecArray; [...] SetLength(PointerAufDasArray^,10); 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^^ |
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:
Dann hat es den selben Effekt.
var
MyPointer : Pointer; [...] New(MyPointer) SetLength(PMyRecArray(MyPointer)^,10); MyPointer := nil; Dispose(MyPointer); @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 |
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: |
Re: Pointer auf dynamisches Array
Wie greife ich denn dann hier auf ein Element des Arrays zu?
|
Re: Pointer auf dynamisches Array
Wie schon gesagt wurde ... wozu soll sowas gut sein?
Ein dynamisches Array ist schon ein Pointer.
Delphi-Quellcode:
oder
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);
Delphi-Quellcode:
wobei ich es maximal so machen würde
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);
Delphi-Quellcode:
type TMyArray = array of irgendwas;
PMyArray = ^TMyArray; var MyArr : TMyArray; var MyArrPointer : PMyArray; MyArrPointer := @MyArr; SetLength(MyArrPointer^, 10); MyArrPointer^[i] |
Re: Pointer auf dynamisches Array
Okay, das versteh ich, aber warum geht dann folgendes nicht?
Delphi-Quellcode:
Ich bekomm jedesmal eine Zugriffsverletzung wenn ich mir die Länge ausgeben lassen will.
length(PDynArray(MyPointer)^);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz