Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Funktion mit offenem Array: Freemem crasht bei _DynArrayClear (https://www.delphipraxis.net/212814-funktion-mit-offenem-array-freemem-crasht-bei-_dynarrayclear.html)

kmma 5. Apr 2023 15:04


Funktion mit offenem Array: Freemem crasht bei _DynArrayClear
 
Ich habe folgenden Wunsch:

Gegen ist die folgende Datenstruktur:
Delphi-Quellcode:
type TDaten = packed reccord
  x: TXArray;
  y: TYArray;
end;
var Daten: TDaten;
wobei
Delphi-Quellcode:
type TX = packed reord
  a: integer;
  bArray: array of word;
end;
type TY = packed record
  cArray: array of TStringList;
  d: cardinal;
end;
TXarray = array of Tx;
TYArray = array of Ty;

Jetzt würde ich gerne in einer Funktion Daten befüllen:
dazu habe ich die Unterfunktionen
Delphi-Quellcode:
function MachXArray: TXArray;
  var i: integer;
begin
  setlength(result, BerechneAnzahlX);
  for i = 0 to BerecchneteAnzahlX - 1 do
    result[i] = BerechneX(i);
end;
function MachYArray: TYArray;
  var i: integer;
begin
  setlength(result, BerechneAnzahlY);
  for i = 0 to BerecchneteAnzahlY - 1 do
    result[i] = BerechneY(i);
end;

function MachDaten;
begin
  Daten.x := MachXArray;
  Daten.Y := MachYArray;
end;
BerechneAnzahlX und BerechneAnzahlY liefern Werte zwischen 0 und 10000. BerechneX und BerechneY setzen die festen Were und legen die Arraylängen fest und füllen die Arrays.
Das ganze klappt manchmal, manchmal kommt aber beim Verlassen der Funktionen eine Zugriffsverletzung bei system._DynArrayClear und ich weiß momentan nicht, wie ich das ganze sauber hinbekomme. Mit geringen Arraaygrößen < 10 zum Testen klappt es immer, im Realbetrieb wenn auch mal ein paar Tausend Arrayelemente vorhanden sind crasht es irgendwann (immer an aderen Stellen).
Ich vermute mal, dass ich ja von den Funktionen nur einen Zeiger auf die eigentlichen Arrays bekomme und beim Verlassen der Funktionen das Array freigegeben wird, aber später über den Zeiger den ich dann gespeichert habe auf bereits freigegebenen Speicher zugegriffen wird (oder so ähnlich).
Wie könne man ein offenes Array mit samt seinem Inhalt sauber aus einer Funktion übergeben?
würde ein New in der Funktion und einem type pXarray = ^TXarray und dann ein new(pXArray^); helfen?

Sinspin 5. Apr 2023 15:20

AW: Funktion mit offenem Array: Freemem crasht bei _DynArrayClear
 
Zitat:

Zitat von kmma (Beitrag 1520707)
... Ich vermute mal, dass ich ja von den Funktionen nur einen Zeiger auf die eigentlichen Arrays bekomme und beim Verlassen der Funktionen das Array freigegeben wird, aber später über den Zeiger den ich dann gespeichert habe auf bereits freigegebenen Speicher zugegriffen wird (oder so ähnlich).

Nö.

Wenn du hier beim Posten Delphi Tags verwendest sieht dein Quelltext gleich viel besser aus und man kann alles ein bisschen besser lesen.
Außerdem fehlen da noch ein paar Deklarationen und Funktionen.
Wenn du die lieferst kommen wir sicher weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:50 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