![]() |
Zu wenig Arbeitsspeicher Fehler
Hi, ich habe versucht aus einer INI mit einer FOR-Schleife und dynamischen Arrays den Inhalt zu extrahieren. Nur bekomme ich den Fehler das ich zu wenig Arbeitsspeicher hätte. Wenn ich dann auf fortfahren klicke kommt die Warnung mit Ungültiger Zeigeroperation. Hier mein Code:
Delphi-Quellcode:
Nur finde ich jetzt nicht meinen Denkfehler.. Kann mir jemand sagen woran das liegt?
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, IniFiles, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) LBName: TListBox; Bevel1: TBevel; Label1: TLabel; Label2: TLabel; LBVorname: TListBox; Label3: TLabel; LBPin: TListBox; ScrollBar1: TScrollBar; procedure FormCreate(Sender: TObject); procedure GetList(i: Integer); private { Private-Deklarationen } vorname: array of String; name: array of String; pin: array of Integer; bearb: array of Boolean; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var ini: TInifile; inte: Integer; begin ini := TIniFile.Create('C:\ProgramData\L-Write\crepesworker_user.ini'); try inte := ini.ReadInteger('Anzahl', 'Anzahl', 0); finally ini.Free; SetLength(vorname, inte); SetLength(name, inte); SetLength(pin, inte); SetLength(bearb, inte); GetList(inte); end; Scrollbar1.Max := inte; end; procedure TForm1.GetList(i: Integer); var ini: Tinifile; int: Integer; suchnach: String; begin ini := Tinifile.Create('C:\ProgramData\L-Write\crepesworker_user.ini'); try for int := 1 to i do begin suchnach := 'User'+IntToStr(int); vorname[i] := ini.ReadString(suchnach, 'Vorname', 'Not_found'); name[i] := ini.ReadString(suchnach, 'Name', 'Not_found'); pin[i] := ini.ReadInteger(suchnach, 'Pin', 0); bearb[i] := ini.ReadBool(suchnach, 'Bearb', true); end; finally ini.Free end; end; end. Danke Luki :) |
AW: Zu wenig Arbeitsspeicher Fehler
Dynamische Arrays fangen bei Index 0 an. Deine "int" Variable startet aber bei 1 und overflowt damit am Ende um 1 Feld.
|
AW: Zu wenig Arbeitsspeicher Fehler
Ok danke, aber ich bekomme immer noch den Fehler.. :gruebel:
|
AW: Zu wenig Arbeitsspeicher Fehler
... da hätten wir noch das -1 im Angebot. 8-)
Delphi-Quellcode:
... oder
for int := 0 to i - 1 do begin
Delphi-Quellcode:
for int := Low(vorname) to High(vorname) do begin
|
AW: Zu wenig Arbeitsspeicher Fehler
Bin ich etwa gerade zu blöd um da was richtig zu machen?! :wall: :wall: :wall: :wall: :wall: Ich bekomme immer noch den Fehler..
Edit: @Haetschmann, es klappt mit beiden nicht.. |
AW: Zu wenig Arbeitsspeicher Fehler
Wieso benutzt Du nicht ein Array of record (oder auch class), in dem dann je Element zusammengehörige Daten stehen? Oder vielleicht noch besser gleich eine Liste (TList, TObjectList or whatever), da kannst Du dynamisch und effizient Daten hinzufügen und wieder löschen.
|
AW: Zu wenig Arbeitsspeicher Fehler
Und dann auch gleich die PIN als
Delphi-Quellcode:
definieren, denn im allg wir damit nicht gerechnet.
String[8]
Gruß K-H |
AW: Zu wenig Arbeitsspeicher Fehler
Gib deinen Variablen mal aussagekräftige Namen und du wirst den Fehler erkennen.
Weil das so ist, verrate ich auch nicht wo und was der Fehler ist, denn dieser Fehler ist eindeutig Schlamperei bei der Benennung der Variablen.
Delphi-Quellcode:
was dann einer lokalen Variablen entspricht, wo ein Index-Wert (z.B. in einer
LIdx
Delphi-Quellcode:
-Schleife) enthalten ist.
for
Ein Argument
Delphi-Quellcode:
enthält eine Anzahl.
ACount : Integer
usw. Benennen kann man Variablen wie man möchte, vernünftig programmieren kann man nur, wenn u.a. die Benennung vernünftig gemacht wird. PS: Die Begründung für dieses Namensgewurschtel finde ich immer gut: "Das dauert mir zu lange, einen passenden Namen zu finden!" - "Und wie lange suchst du jetzt nach dem Fehler, den du nicht eingebaut hättest, wenn du die Variablen korrekt benannt hättest?" - Schweigen im Walde :roll: |
AW: Zu wenig Arbeitsspeicher Fehler
Ach ja, dein
Delphi-Quellcode:
ist absolut falsch. Wenn beim Auslesen aus der Instanz ein Fehler auftritt, dann wird die Instanz gelöscht (ja, gut) und diese ganz tollen Sachen werden auch noch ausgeführt :shock:
ini := TIniFile.Create(...);
try // mit ini arbeiten finally ini.Free; // ganz viele tolle Sachen machen end; So wird ein Schuh draus
Delphi-Quellcode:
Bei einem Fehler wird die Instanz gelöscht (Speicherlecks vermeiden), der Rest nicht mehr ausgeführt und eine Fehlermeldung wird angezeigt.
ini := TIniFile.Create(...);
try // mit ini arbeiten finally ini.Free; end; // ganz viele tolle Sachen machen |
AW: Zu wenig Arbeitsspeicher Fehler
Jap, Fehler gefunden.. Wie kann man nur so dämlich sein.. :wall: :D nicht:
Delphi-Quellcode:
sondern:
for int := 0 to i -1 do begin
suchnach := 'User'+IntToStr(int); vorname[i] := ini.ReadString(suchnach, 'Vorname', 'Not_found'); name[i] := ini.ReadString(suchnach, 'Name', 'Not_found'); pin[i] := ini.ReadInteger(suchnach, 'Pin', 0); bearb[i] := ini.ReadBool(suchnach, 'Bearb', true);
Delphi-Quellcode:
Danke :thumb:
for int := 0 to i -1 do begin
suchnach := 'User'+IntToStr(int); vorname[int] := ini.ReadString(suchnach, 'Vorname', 'Not_found'); name[int] := ini.ReadString(suchnach, 'Name', 'Not_found'); pin[int] := ini.ReadInteger(suchnach, 'Pin', 0); bearb[int] := ini.ReadBool(suchnach, 'Bearb', true); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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