AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zu wenig Arbeitsspeicher Fehler

Ein Thema von Luki206 · begonnen am 21. Feb 2014 · letzter Beitrag vom 21. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2      
Luki206
(Gast)

n/a Beiträge
 
#1

Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 13:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 13:39
Dynamische Arrays fangen bei Index 0 an. Deine "int" Variable startet aber bei 1 und overflowt damit am Ende um 1 Feld.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#3

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 13:44
Ok danke, aber ich bekomme immer noch den Fehler..
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 13:55
... da hätten wir noch das -1 im Angebot.
for int := 0 to i - 1 do begin ... oder
for int := Low(vorname) to High(vorname) do begin
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#5

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 14:21
Bin ich etwa gerade zu blöd um da was richtig zu machen?! Ich bekomme immer noch den Fehler..
Edit: @Haetschmann, es klappt mit beiden nicht..

Geändert von Luki206 (21. Feb 2014 um 14:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 14:29
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 14:32
Und dann auch gleich die PIN als String[8] definieren, denn im allg wir damit nicht gerechnet.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 14:58
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 LIdx was dann einer lokalen Variablen entspricht, wo ein Index-Wert (z.B. in einer for -Schleife) enthalten ist.
Ein Argument 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (21. Feb 2014 um 15:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 15:10
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

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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Luki206
(Gast)

n/a Beiträge
 
#10

AW: Zu wenig Arbeitsspeicher Fehler

  Alt 21. Feb 2014, 15:12
Jap, Fehler gefunden.. Wie kann man nur so dämlich sein.. 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:45 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