Autor Beitrag
oneP
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: So 30.08.09 17:48 
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)
ausblenden 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
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Highscore.ini');
try
  ...
finally
  ini.Free;
end;
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 31.08.09 09:18 
Der Zugriff auf Element j-1 dürfte beim ersten Element auch zu Problemen führen.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 31.08.09 09:21 
Joar das ist mir auch ins Auge gesprungen ein Array beginnt bei 0 und nicht bei 1.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 31.08.09 09:38 
Ein dynamisches Array beginnt immer bei 0, ein statisches nicht unbedingt (dieses z.B. nicht).
Zitat:
ausblenden Delphi-Quelltext
1:
score: array[1..10of string;					
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 31.08.09 11:45 
Sagen wir es mal so: ein Array beginnt beim ersten Element, den Index kann man selbst festlegen ;)
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Mo 31.08.09 19:40 
Kannst du dann deinen Thread noch als "Erledigt" markieren? Danke.