Einzelnen Beitrag anzeigen

kmma

Registriert seit: 26. Jul 2010
9 Beiträge
 
Delphi 2 Desktop
 
#1

Funktion mit offenem Array: Freemem crasht bei _DynArrayClear

  Alt 5. Apr 2023, 15:04
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?

Geändert von kmma ( 5. Apr 2023 um 18:47 Uhr)
  Mit Zitat antworten Zitat