| Autor |
Beitrag |
oneP
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: 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)
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 Narses: Topic aus Sonstiges (Delphi) verschoben am So 30.08.2009 um 23:22
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 30.08.09 18:52
DeddyH hat folgendes geschrieben : | | 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..10] of 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 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 Yogu ja gerade gemacht.
Zu zweitens: 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
|
Verfasst: Mo 31.08.09 09:18
Der Zugriff auf Element j-1 dürfte beim ersten Element auch zu Problemen führen.
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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
|
Verfasst: 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..10] of string; | |
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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
|
Verfasst: Mo 31.08.09 11:45
Sagen wir es mal so: ein Array beginnt beim ersten Element, den Index kann man selbst festlegen 
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: 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
      
Beiträge: 2157
Erhaltene Danke: 72
Java (Eclipse), Python (Sublimetext 3)
|
Verfasst: Mo 31.08.09 19:40
Kannst du dann deinen Thread noch als "Erledigt" markieren? Danke.
|
|