Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler bei For-schleife


oneP - So 30.08.09 17:48
Titel: Fehler bei For-schleife
Hallo,

ich bin dabei eine Highscore für mein Spiel zu machen. Ich möchte die erreichten Punkte (Endscore) in eine Ini Datei speichern. Dabei soll auch bestimmt werden auf welchen Platz in der Liste die Punkte aufgeschrieben werden (1.Platz, 2.Platz, .....10.Platz)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm3.Label24Click(Sender: TObject);
var ini:TiniFile; j:integer;  score:array [1..10]of string;
begin
ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+ 'Highscore.ini');

for j := 1 to 10do
   score[j] := ini.ReadString('Highscore','Score'+inttostr(j) ,'');
   if (Endscore >= StrtoInt(Score[j])) and(Endscore < StrToInt(Score[j-1])) then begin
     Score[j] := INttostr(Endscore);  ini.writeString('Highscore','Score'+inttostr(j) ,Score[j]);
     Readscore;
   end;
end;


Readscore ließt die Scoreliste aus der ini-Datei und schreibt sie auf das Formular.

Jetz hab ich aber das Problem dass mir ein Fehler angezeigt wird (Fehler in Adresse...).
Könnt mir vielleicht jemand erklären was Falsch ist oder wie man das anders machen kann?
Ich sitz schon 2 tage dran und hab alles mögliche ausprobiert...

Vielen Dank!


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 30.08.2009 um 23:22


Delete - So 30.08.09 18:04

Wieso sortierst Du das Array nicht einfach nach dem Einlesen? Und was das Lesen, Schreiben und dann wieder Lesen soll, ist mir auch verborgen geblieben. Außerdem sollte der Compiler eine Warnung ausgeben, dass j nach Schleifenende undefiniert ist.


Yogu - So 30.08.09 18:52

user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem sollte der Compiler eine Warnung ausgeben, dass j nach Schleifenende undefiniert ist.

Jetzt komm, das kannst du schon etwas direkter sagen: Da fehlt ein begin ... end. Ich rücke deinen Code mal richtig ein, dann siehst du, wo's hakt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm3.Label24Click(Sender: TObject);
var
  j: integer;
  ini: TiniFile;
  score: array[1..10of string;
begin
  ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Highscore.ini');

  for j := 1 to 10 do
    score[j] := ini.ReadString('Highscore''Score' + IntToStr(j), '');

  if (Endscore >= StrtoInt(Score[j])) and (Endscore < StrToInt(Score[j-1])) then
  begin
    Score[j] := IntToStr(Endscore);
    ini.writeString('Highscore''Score' + IntToStr(j), Score[j]);
    Readscore;
  end;
end;

Meinst du nicht, dass die if-Verschachtelung in die for-Schleife rein soll? Code-Einrücken ist übrigens eine ganz nützliche Sache, wenn man sie konsequent durchzieht, sieht man viele Fehler bereits im Voraus :idea:


jaenicke - So 30.08.09 18:53

Erstens ist der Quelltext grausam formatiert, sonst würde der Fehler, dass die for-Schleife nur die erste Zeile umfasst, auch auffallen.
Zweitens ist das ein Speicherleck, da das Ini-Objekt nur erzeugt, aber der Speicher nie wieder freigegeben wird.

Ich sehe schon in orange, dass ich zu erstens gar nichts mehr schreiben muss, das hat user profile iconYogu ja gerade gemacht. :D

Zu zweitens:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Highscore.ini');
try
  ...
finally
  ini.Free;
end;


Delete - Mo 31.08.09 09:18

Der Zugriff auf Element j-1 dürfte beim ersten Element auch zu Problemen führen.


thepaine91 - Mo 31.08.09 09:21

Joar das ist mir auch ins Auge gesprungen ein Array beginnt bei 0 und nicht bei 1.


Delete - Mo 31.08.09 09:38

Ein dynamisches Array beginnt immer bei 0, ein statisches nicht unbedingt (dieses z.B. nicht).
Zitat:

Delphi-Quelltext
1:
score: array[1..10of string;                    


thepaine91 - Mo 31.08.09 10:12

Hmm wenn man ihn so erstellt stimmt. Ich erzähl heut wieder zeug. ;) Naja danke für den Hinweis.
Liegt wohl daran das ich niemals einen Array bei 1 beginnen würde. Ich mache meine standartmäßig von [0..n].

Edit: Obwohl ich davon ausgehe das Delphi intern den Array trotzdem von 0-9 setzen wird. Denn rein logisch kann ein Array nur bei 0 beginnen. Wenn er bei 5 beginnt wären die ersten 5 Stellen leer. Daher ist mein Satz nicht falsch.


Delete - Mo 31.08.09 11:45

Sagen wir es mal so: ein Array beginnt beim ersten Element, den Index kann man selbst festlegen ;)


thepaine91 - Mo 31.08.09 12:10

Deddy H genau so siehts aus. Ist aber nur ein geschenk von Borland(Delphi). Die Optimieren eben so einiges weg.
Sowas ist auch nicht in alles Programmiersprachen möglich.


oneP - Mo 31.08.09 18:22

Hallo,

@Yogu: Danke für den Tipp. Die If-Verschachtelung liegt jetzt in der for-schleife.

@DaddyH: der fehler lag tatsächlich bei diesem "j-1". Als die For-schleife für j die Eins eingesetzt hat, war j-1 = 0 . Und weil es keinen Nullten Platz gibt und deswegen nicht gelesen werden kann, wurde eine Fehlermeldung gezeigt.
Mitlerweile hab ich alles verbessert und alles funzt soweit.

Danke an alle!


Regan - Mo 31.08.09 19:40

Kannst du dann deinen Thread noch als "Erledigt" markieren? Danke.