AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktion mit offenem Array: Freemem crasht bei _DynArrayClear
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion mit offenem Array: Freemem crasht bei _DynArrayClear

Ein Thema von kmma · begonnen am 5. Apr 2023 · letzter Beitrag vom 5. Apr 2023
Antwort Antwort
kmma

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

Funktion mit offenem Array: Freemem crasht bei _DynArrayClear

  Alt 5. Apr 2023, 16: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 19:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Funktion mit offenem Array: Freemem crasht bei _DynArrayClear

  Alt 5. Apr 2023, 16:20
... 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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 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