![]() |
Array mit Records: Access violation
Liebe Helfer,
Delphi-Quellcode:
So sieht der Anfang einer kleinen Anwendung aus. Problem: Sobald ich die Obergrenze des Arrays in der vorletzten Codezeile auf mehr als 20000 erhöhe, erhalte ich einen Access Violation Fehler. An Speichermangel sollte es doch nicht liegen, wenn ich 4 GB Arbeitsspeicher (von 8 installierten) noch frei habe.
var
Form1: TForm1; ListAll: TStringlist; DName : String; implementation {$R *.dfm} procedure TForm1.btnEinlesenClick(Sender: TObject); const Sens : array[1..5] of String = ('Nordseite', 'Vorplatz', 'Terrasse', 'Speicher', 'Garage'); Type MPunkt = record Z : String[16]; // Datum und Uhrzeit MT : String[5]; // Lufttemperatur MF : String[2]; // rel. Luftfeuchte MTP : String[5]; // Taupunkt MWI : String[5]; // Wärmeindex end; var DPfad, ZielNameT, ZielnameF, ZielnameTP, ZielnameWI, Du: String; Kanal, PP, i, j, k, l, n, h, PosSemi: Integer; // Kanal = Sensor, PP = Position Punkt Dateiname, i, j … = Laufvariablen LA2, LA3, LA4, LA5 : TStringList; Tag, Monat : String[2]; Jahr : String[4]; Uhrzeit : String[5]; T, F, TP, WI, Y : String; // Zwischenvariablen für Temperatur, Feuchte, Taupunkt und Wärmeindex MW : Array[1..20000] of MPunkt; Diff, Mittel, Wert1, Wert2 : Single; Kann mich jemand bitte vom Schlauch heben? Oswald |
AW: Array mit Records: Access violation
das dürfte vermutl. der Stack nicht mit machen
|
AW: Array mit Records: Access violation
Wandelt der Compiler automatisch diese string[XX] in ShortStrings um?
Wenn nicht würde ich das mal als Datentyp im Record testen. |
AW: Array mit Records: Access violation
"Arbeitspsiecher"
Du hast "lokale" Variablen definiert und die liegen auf dem Stack, nicht dem Heap. ![]() Oder ein dynamisches Array, anstatt einem statischen Array. Da liegt dann hier nur die Variable (der Array-Zeiger) auf dem Stack, aber die Daten auf dem Heap. PS: 32 Bit-Anwendung hat standardmäßig immer maximal 2 GB. (31 Bit zuzüglich Vorzeichen) Man kann ein Compilerflag setzen, dann sind es 4 GB (32 Bit) bzw. in 32-Bit Windows maximal 3 GB, aber das bringt dir hier eh nichts. Tipp: informiere dich über den Unterschid von virtuellem Speicher und physischem Speicher. Und 4 GB von 8 stage auch nichts aus, denn da kommt noch die Auslagerungsdatei hinzu. Und falls aktiviert auch noch eine Speicherkomprimierung. Zitat:
aber ja, das sind ShortStrings. (nur der "uralte" ganze String wurde in ShortString umbenannt, als der neue String AnsiString erfunden wurde ... die mit Längenangabe heißen noch wie früher) |
AW: Array mit Records: Access violation
Wär's nicht sinnvoller, den ganzen Variablenkram, vor allem das Record, in eine Klasse zu packen bzw. zu verwandeln?
Grüße Dalai |
AW: Array mit Records: Access violation
Sollte man die Daten nicht eher in Realzahlen wandeln? Die sind nur 4 Byte und man auch damit rechnen.
|
AW: Array mit Records: Access violation
Ach ja, 20000*40 sind "nur" 800 KB, nur der Stack ist eben recht klein,
aber wenn man ordentlich arbeitet, dann reicht er aber vollkommen aus. |
AW: Array mit Records: Access violation
Delphi-Quellcode:
s verwenden? himitsu sagt mir bestimmt auch, ob das überhaupt einen Unterschied macht.
packed array
Oder nur einen ShortString bzw. String[33] und dann Eigenschaften benutzen? Keine Ahnung, ob das hilft. Problem dürfte aber halt Größe der lokalen Variablen sein, daher: Zitat:
Zitat:
|
AW: Array mit Records: Access violation
Also
Delphi-Quellcode:
Vielleicht besser:
Type MPunkt = record
Z : String[16]; // Datum und Uhrzeit MT : String[5]; // Lufttemperatur MF : String[2]; // rel. Luftfeuchte MTP : String[5]; // Taupunkt MWI : String[5]; // Wärmeindex
Delphi-Quellcode:
Oder
Type
PPunkt = ^MPunkt MPunkt = packed Record // 21 Byte; Z : TDateTime; MT : Int1632; // °C 8.32 * 10 = 832 MF : String[2]; MTP : Int32; MWI : String[5]; end; var MW : Array[1..20000] of PPunkt; // ~78kb
Delphi-Quellcode:
Mavarik
Type
PPunkt = ^MPunkt MPunkt = packed Record // 25 Byte; Z : TDateTime; MT : Int1632; // °C 8.32 * 10 = 832 MF : String[2]; MTP : Int32; MWI : String[5]; Next : PPunkt; end; var Root : PPunkt; // 4 Byte Stack & ~488KB Heap |
AW: Array mit Records: Access violation
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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-2025 by Thomas Breitkreuz