Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamische Arrays (https://www.delphipraxis.net/33975-dynamische-arrays.html)

Chris WF 15. Nov 2004 19:47


Dynamische Arrays
 
Delphi-Quellcode:
type
  TDatei = class
    name,pass: String;
  end;
  TDaten = class
    datei: array of TDatei;
    procedure Einlesen;
  end;
Delphi-Quellcode:
var
   Form1: TForm1;
   Daten: TDaten;

implementation

procedure TDaten.Einlesen;
var xdatei: textfile;
var dateiname: string;
var i,n: integer;
begin
   i := 0;
   dateiname := ExpandFileName('keys.txt');
   assignfile(xdatei,dateiname);
   reset(xdatei);
   repeat inc(i); readln(xdatei); until eof(xdatei);
   SetLength(daten.datei,i+1);
   for n := 0 to i do
   begin
      readln(xdatei,daten.datei[i].name);
      readln(xdatei,daten.datei[i].pass);
   end;
   closefile(xdatei);
end;
So, das Problem liegt im SetLength. Wenn ich das Programm schrittweise ausführe, kommt eine Fehlermeldung "Zugriffsverletzung bei Adresse ... "
Woran kann das liegen und wie kann ich das beheben?

Danke
Chris WF

Edit: Achso, da ist noch ein EOF-Problem, das hat aber nicht Priorität

Luckie 15. Nov 2004 19:53

Re: Dynamische Arrays
 
Nach der Zeile:
Delphi-Quellcode:
inc(i);
Ist i eins.
Hier
Delphi-Quellcode:
readln(xdatei,daten.datei[i].name);
willst du aber auf das 0'te Element zugreifen nur da steht nichts drinne.

Und so was:
Delphi-Quellcode:
repeat inc(i); readln(xdatei); until eof(xdatei);
Macht man nicht, weil sich das so gut wie gar nicht zeilenweise debuggen läßt.

Dann fällt mir noch das auf:
Delphi-Quellcode:
SetLength(daten.datei,i+1);
for n := 0 to i do
Auch das ist ungewöhnlich. Normalerweise läßt man ein 0 basierdendes Array von 0 bis Anzahlelement-1 laufen.

DerDan 15. Nov 2004 19:58

Re: Dynamische Arrays
 
So wie ich das sehe willst du zwei zusammengehöhrende Listen verwalten,

da würde ich zwei TStringList Objecte anlegen und in die eine den einen Wert und in den anderen den anderen Wert einspeichern.

Ich denke das ist einfacher.

Wenigstens mal drüber nachdenken

Gruß derDan

Chris WF 15. Nov 2004 20:01

Re: Dynamische Arrays
 
Ist denn die Länge eines TStringsList im Programm änderbar?

DerDan 15. Nov 2004 20:11

Re: Dynamische Arrays
 
TStringList verwaltet belibig viele Strings, die beliebig lang sein können.

Delphi-Quellcode:
strListName := TStringList.Create;
strListPass := TStringList.Create;
.
.
.
strListName.Add (Name);
strListPass.Add (Pass);
...

auf die Strings zugreifen kannst du dann einfach mit

Delphi-Quellcode:
label.caption := strListName[i] + ' -> ' + strListPass[i];
i darf zwichen 0 und strListName.Count - 1 sein

DerDan

Christian Seehase 15. Nov 2004 21:10

Re: Dynamische Arrays
 
Moin Chris,

nicht zu vergessen:

Code:
for [color=red][b]n[/b][/color] := 0 to i do
   begin
      readln(xdatei,daten.datei[[color=red][b]i[/b][/color]].name);
Dein Schleifenzähler ist n, aber die Variable die als Index dient ist i.

jim_raynor 16. Nov 2004 06:36

Re: Dynamische Arrays
 
1. Ich kann mir gut vorstellen, dass es mit daten.datei zusammenhängt. Wird Daten überhaupt mit einem gültigen TDaten-Objekt versorgt? Wenn ja, dann ist es nicht sinnvoll so auf das Array zuzugreifen, da du dann immer das gleiche Array hast, auch wenn du mehere Instanzen von TDaten erstellst.
Nimm also lieber das daten. vorher immer weg.

2. Schleifenzähler wurde schon angesprochen. Zudem mach deine Schleife nur bis i-1 und bei SetLength machst du nur i statt i+1

3. Vor der Schleife mach ein Reset, dann beginnt er wieder beim Datei Anfang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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 by Thomas Breitkreuz