Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zu wenig Arbeitsspeicher Fehler (https://www.delphipraxis.net/179233-zu-wenig-arbeitsspeicher-fehler.html)

Luki206 21. Feb 2014 13:37

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:
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.
Nur finde ich jetzt nicht meinen Denkfehler.. Kann mir jemand sagen woran das liegt?
Danke
Luki :)

Zacherl 21. Feb 2014 13:39

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.

Luki206 21. Feb 2014 13:44

AW: Zu wenig Arbeitsspeicher Fehler
 
Ok danke, aber ich bekomme immer noch den Fehler.. :gruebel:

haentschman 21. Feb 2014 13:55

AW: Zu wenig Arbeitsspeicher Fehler
 
... da hätten wir noch das -1 im Angebot. 8-)
Delphi-Quellcode:
for int := 0 to i - 1 do begin
... oder
Delphi-Quellcode:
for int := Low(vorname) to High(vorname) do begin

Luki206 21. Feb 2014 14:21

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..

DeddyH 21. Feb 2014 14:29

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.

p80286 21. Feb 2014 14:32

AW: Zu wenig Arbeitsspeicher Fehler
 
Und dann auch gleich die PIN als
Delphi-Quellcode:
String[8]
definieren, denn im allg wir damit nicht gerechnet.

Gruß
K-H

Sir Rufo 21. Feb 2014 14:58

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.
  • Felder einer Klasse fangen mit F an
  • Argumente von Methoden/Prozeduren fangen mit A an
  • Lokale Variablen fangen mit L an
Somit gibt es dann z.B. ein
Delphi-Quellcode:
LIdx
was dann einer lokalen Variablen entspricht, wo ein Index-Wert (z.B. in einer
Delphi-Quellcode:
for
-Schleife) enthalten ist.
Ein Argument
Delphi-Quellcode:
ACount : Integer
enthält eine Anzahl.
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:

Sir Rufo 21. Feb 2014 15:10

AW: Zu wenig Arbeitsspeicher Fehler
 
Ach ja, dein
Delphi-Quellcode:
ini := TIniFile.Create(...);
try
  // mit ini arbeiten
finally
  ini.Free;
  // ganz viele tolle Sachen machen
end;
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:

So wird ein Schuh draus
Delphi-Quellcode:
ini := TIniFile.Create(...);
try
  // mit ini arbeiten
finally
  ini.Free;
end;
  // ganz viele tolle Sachen machen
Bei einem Fehler wird die Instanz gelöscht (Speicherlecks vermeiden), der Rest nicht mehr ausgeführt und eine Fehlermeldung wird angezeigt.

Luki206 21. Feb 2014 15:12

AW: Zu wenig Arbeitsspeicher Fehler
 
Jap, Fehler gefunden.. Wie kann man nur so dämlich sein.. :wall: :D nicht:
Delphi-Quellcode:
 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);
sondern:
Delphi-Quellcode:
 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);
Danke :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.
Seite 1 von 2  1 2      

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