Liste in Array

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Jim92
Beiträge: 24
Registriert: Sa 29. Jan 2011, 13:09

Liste in Array

Beitrag von Jim92 »

Moinson
Bei meinem Werk (für die dies interessiert: immernoch das Kartenspiel) Soll der Inhalt eines memos in ein Array eingefügt werden. Wie das ganze funktioniert, weiß ich. Auch weiß ich das die Zahl der Werte die integriert werden sollen nicht größer sein darf als die Anzahl der zeilen. Sonst erhält man eine Fehlermeldung mit dm inhalt:

List index exceeds bounds (Zahl der Zeilen)

Eben diese Fehlermeldung erscheint bei mir aber nun ständig bei Programmstart. Mein Quelltext (für diese Aktion) schaut in etwa so aus:

Code: Alles auswählen

for y:= 1 to 132 do
  begin
     Karte[Wert,y]:=StrToInt(Form5.Memo1.Lines[y]);
     Karte[Klasse,y]:=StrToInt(Form5.Memo3.Lines[y]);
     KarteName[1,y]:=Form5.Memo2.Lines[y];
  end;
(Meine Memos sind alle auf einem Extra Formular angelegt, zur besseren Übersichtlichkeit)
Wie bereits erwähnt erscheint bei mir bei starten des Programmes immer die Fehlermeldung:

List index exceeds bounds (132)

Weiß wer was ich dagegen tun kann? Ich bin für jede Hilfe dankbar!

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Liste in Array

Beitrag von theo »

Sieht ziemlich nach krankem Design aus.

Bau dir eine passende Klasse oder ein Record und hänge alles in eine TList. Problem gelöst (und alle zukünftigen auch).

Jim92
Beiträge: 24
Registriert: Sa 29. Jan 2011, 13:09

Re: Liste in Array

Beitrag von Jim92 »

ich kann dir nicht ganz folgen

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Liste in Array

Beitrag von MAC »

mach mal

Code: Alles auswählen

for y:= 1 to 131 do
klappt es ?
Die einträge einer Liste beeginnen bei 0 und enden bei Count-1.
Das heißt der 132ste Eintrag ist Memo1.Lines[131], der 1. Eintrag ist Memo1.Lines[0]...

Zudem solltest theos vorschlag befolgen - und auf gar keinen fall einfach for i := 1 to 100 do ... in verbindung mit arrays schreiben.
Da ist viel besser

Code: Alles auswählen

for i := 0 to high(Karte[wert]) do // bzw. for i := 0 to high(Karte) bei 1 dimensionalen arrays.
Eine abfage:

Code: Alles auswählen

if i > Memo1.Lines.Count-1 then break;//  Memo1.Lines[Memo1.Lines.Count-1] ist der letze Gültige eintrag den du aus einer liste
wäre nicht verkehrt , da dein Programm so eine zu kurze memo einfach ignorieren würde (break beendet die aktuelle schleife, exit würde auch gehen, das beendet die aktuelle funktion)

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Liste in Array

Beitrag von theo »

Jim92 hat geschrieben:ich kann dir nicht ganz folgen
Ich dir auch nicht.
Ich weiss ja nicht was

Karte[Wert,y]:=
Karte[Klasse,y]:=

sein soll.
Ich weiss nur, dass das nach Ärger aussieht.

Jim92
Beiträge: 24
Registriert: Sa 29. Jan 2011, 13:09

Re: Liste in Array

Beitrag von Jim92 »

Also erstmal danke an euch beide, warn schon wichtige Informationen dabei.
Leider war nich die Lösung des Problems dabei.

@Theo:
Also das Kartenspiel besteht aus Karten mit unterschiedlichen Werten (z.B. Pik 8 ist wertvoller als Pik 7), diese Werte werden indem Array Karte gespeichert (die Konstante Wert übernimmt hier den Wert 1). In dem selben Array soll auch die Art der Karte gespeichert werden (z.B. Pik oder Karo oder Herz usw.) und das wird über die Konstante Klasse, die hier den Wert 2 übernimmt, aufgenommen werden. So hoffe das is verständlich so.

@Mac:
Also die Ideen sind ja ganz gut, aber bei deiner ersten Idee lässt er dann die letzte Karte weg. das sollte möglichst vermieden werden. Hab jetzt ne Zeile zusätzlich angefügt, in der nur sinnlose Buchstaben stehen, damit das funktioniert, würde mich aber trotzdem interessieren, falls jemand ne idee hat, wie ich das vermeiden kann.
Außerdem wird die Anzahl der Karten vom Spieler ausgewählt, so das ich der Schleife nen maximalwert in Form einer Variable vorgeben muss. Wie schon gesagt, hab jetzt ne Zeile angefügt und den Wert der Variable um eins erhöhen lassen, damits geht.
Wäre aber schon interessant zu wissen worans liegt, denn eigentlich stimmen alle werte überein (Das Memo hat 132 zeilen, wobei die 1. zeile, also die Zeile 0, nicht mitgezählt wird, weil dort steht, was das für werte sind)

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Liste in Array

Beitrag von theo »

Das ist ein typischer Fall, wo die Objektorientierte Programmierung gewissermassen auf der Hand liegt.

Mach dir eine Klasse mit allen Eigenschaften deiner Karten. z.B.

Code: Alles auswählen

TKarte=Class
private 
fWert:integer;
fType:TKartenTyp;
fBild:TBitmap;
etc....
end;
Dann mach dir einen Konstruktor dafür und benutze eine TList (KartenSpiel).

z.B. (Pseudo)

KartenSpiel.Add(TKarte.Create(1,ktPik8,'Pik8.png'));

etc...

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Liste in Array

Beitrag von pluto »

Ein Record würde auch reichen und du könntest das ganze relativ leicht in einer TList speichern. Dann musst du dich auch nicht mit einem Array rumägern.
MFG
Michael Springwald

Jim92
Beiträge: 24
Registriert: Sa 29. Jan 2011, 13:09

Re: Liste in Array

Beitrag von Jim92 »

hmm müste ich mal ausprobieren

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Liste in Array

Beitrag von Maik81ftl »

Jim92 hat geschrieben:Also erstmal danke an euch beide, warn schon wichtige Informationen dabei.
Leider war nich die Lösung des Problems dabei.

@Theo:
Also das Kartenspiel besteht aus Karten mit unterschiedlichen Werten (z.B. Pik 8 ist wertvoller als Pik 7), diese Werte werden indem Array Karte gespeichert (die Konstante Wert übernimmt hier den Wert 1). In dem selben Array soll auch die Art der Karte gespeichert werden (z.B. Pik oder Karo oder Herz usw.) und das wird über die Konstante Klasse, die hier den Wert 2 übernimmt, aufgenommen werden. So hoffe das is verständlich so.

@Mac:
Also die Ideen sind ja ganz gut, aber bei deiner ersten Idee lässt er dann die letzte Karte weg. das sollte möglichst vermieden werden. Hab jetzt ne Zeile zusätzlich angefügt, in der nur sinnlose Buchstaben stehen, damit das funktioniert, würde mich aber trotzdem interessieren, falls jemand ne idee hat, wie ich das vermeiden kann.
Außerdem wird die Anzahl der Karten vom Spieler ausgewählt, so das ich der Schleife nen maximalwert in Form einer Variable vorgeben muss. Wie schon gesagt, hab jetzt ne Zeile angefügt und den Wert der Variable um eins erhöhen lassen, damits geht.
Wäre aber schon interessant zu wissen worans liegt, denn eigentlich stimmen alle werte überein (Das Memo hat 132 zeilen, wobei die 1. zeile, also die Zeile 0, nicht mitgezählt wird, weil dort steht, was das für werte sind)
Jim92. da muß ich dich mal mit der nase draufstoßen. hatte das Problem selber auch in meinem aktuellen Projekt.
Steht auf der ersten Seite.

Hier aber für dich nochmal der auszug des Fehlerhaften Sektion.

Code: Alles auswählen

For A:= 1 to 366 do
         begin
         RegelDaten.ICO[A]:= 'Image' + IntToStr(A);
         TempStr1.Add(RegelDaten.ICO[A] + ' | ' + TempStr2[A-1]);
         RegelDaten.ZIM:= IntToStr(A);
         end;
wenn du dir den Beitrag weiter durchliest, kommst du selber auch auf die Lösung.

Kleiner Tipp.

Bei mir hatte der Fehler Etwas mit der Var. TemoStr2: TStringList zu tun.

Hoffe, das ich dir damit etwas weiter helfen konnte.

g Maik
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten