Wo liegt der Fehler? String Auswertung

fh_study

Erfahrenes Mitglied
Ja Hallo,

ich mal wieder ...

inzwischen ist mein "Mensch Ärgere Dich Nicht" Spiel fast fertig. Nur habe ich jetzt irgendwie einen Denkfehler im Laden des Spielstandes aus einer Datei. Der Spielstand wird als Text (also als CString) in einer beliebigen Datei gespeichert, das klappt auch der Inhalt sieht dann folgendermaßen aus:

[PlayerId]=0;
[LastDice]=3;
[Computergegner]=1;
[AnzahlSpieler]=1;
[FirstPlayer]=0;
[SaveWuerfeln]=1;
[SavePlayer]=1;

[CurrentLast00]=5;4;
[CurrentLast01]=1;1;
[CurrentLast02]=2;2;
[CurrentLast03]=3;3;
[CurrentLast10]=0;0;
[CurrentLast11]=1;1;
[CurrentLast12]=2;2;
[CurrentLast13]=3;3;
[CurrentLast20]=11;8;
[CurrentLast21]=1;1;
[CurrentLast22]=2;2;
[CurrentLast23]=3;3;
[CurrentLast30]=0;0;
[CurrentLast31]=1;1;
[CurrentLast32]=2;2;
[CurrentLast33]=3;3;

Der ganze Teil von CurrentLast00 bis CurrentLast33 ist die Position der Spielfiguren 0 bis 3 der Spieler 0 bis 3 (bei 4 Spielern)
also heißt das ganze übersetzt:
[CurrentLast SpielerId SpielsteinId]=aktuelle Position;alte Position;

Da ich jedoch diese Werte als Integer brauche und das ganze nunmal in einem langen String liegt habe ich folgende Funktion geschrieben: (Auszug)
Code:
CString tmp, lstr; CMyGameDoc* pDoc = GetDocument();
		int pos;
		//Laden des restlichen Strings
		lstr = pDoc->LoadPos;

		//Laden der Positionen Spieler 0 bis 3 Spielsteine 0 bis 3
		for(int x=0; x<4; x++)
		{
			for(int y=0; y<4; y++)
			{
				//Finden des ersten =
				pos = lstr.Find('=');

				//Löschen des  ausgewerteten Bereiches
				lstr.Delete(0,pos);

				//Finden des 1. ;
				pos = lstr.Find(';');

				//Kopie des Wertes zwischen = und ;
				tmp = lstr.Left(pos);
				//str.Format("%s\n%s",str,tmp);
	
				//Laden des Wertes in CMyPlayer
				pDoc->pPlayer[x].CurrentFiguresPosition[y] = atoi(tmp);

				//Löschen bis zum 1.;
				lstr.Delete(0,pos);

				//Finden des 2. ;
				pos = lstr.Find(';');

				//Kopie des Wertes zwischen 1.; und 2.;
				tmp = lstr.Left(pos);
	
				//Laden des Wertes in CMyPlayer
				pDoc->pPlayer[x].LastFiguresPosition[y] = atoi(tmp);

				//Löschen bis zum 2.;
				lstr.Delete(0,pos);

			}
		}
Der String aus der Datei ist übrigens in lstr geladen und der Teil bis [CurrentLast00] ist bereits von einer anderen Funktion ausgewertet (die leider auch nicht funktioniert, da da waohl der gleiche Fehler vorliegt.

Leider finde ich den Fehler nicht ... Vielleicht einer von euch?

vermute mal ich verpeil da was mit dem atoi
 
Habe gerade mal noch gesehen, dass der Fehler nicht bei atoi liegt, sondern die Variable tmp ist leer - warum auch immer. Bin für jeden Vorschlag offen
 
Hi ...

Schau mal ob dir die Funktion 'sscanf' da helfen kann. Mit der kannst du aus einem String von dem du weißt wie er formatiert Daten auslesen (ähnlich wie CString.Format, nur halt anders rum ...)

Gruß
Shai
 
Hallo,

Ich würde dir den Vorschlag machen die Spielstände auf eine andere weiße zu speichern.
Eine .ini Datei würde ähnlich aussehen es gibt aber schon Funktionen sie zu verwenden.
( zb. WritePrivateProfileString zum speichern eines Strings und GetPrivateProfileString zum auslesen ).
So lassen sie sich auch einfach nachbearbeiten ( von außerhalb ).
Oder einfach binär speichern ( fwrite, fread).
 
moin


Dein aoti:
Code:
pDoc->pPlayer[x].CurrentFiguresPosition[y] = atoi(tmp);

ist an sich richtig, allerdings unter Vorbehalt da nicht ersichtlich ist wie pPlayer[x].CurrentFiguresPosition[y] aufgebaut ist.

Ich würde auch zu einer "richtigen" .ini raten, vielleicht hilft dir da flgender Link: http://www.tutorials.de/tutorials154114.html&highlight=ini

Oder XML.

Edit:
Hab den zweiten Beitrag nciht gesehen, drum hat sich das mit atoi wirklich erledigt.


mfg
umbrasaxum
 
Zuletzt bearbeitet:
erstmal Danke an Alle!

Überprüf mal wie groß "pos" ist wenn du .Left(pos) aufrufst.
genau das habe ich gerade gemacht, und siehe da, da lag der Fehler auch fast.

Fehler liegt genau hier:
Code:
//Finden des ersten =
pos = lstr.Find('=');

//Löschen des  ausgewerteten Bereiches
lstr.Delete(0,pos);

Das muss natürlich so aussehen:
Code:
//Finden des ersten =
pos = lstr.Find('=');

//Löschen des  ausgewerteten Bereiches
lstr.Delete(0,pos+1);
Weil sonst ist im folgenden tmp.Left(pos) z.B. folgendes gespeichert: "=12" und das "=" kann natürlich atoi nicht in einen Integer umwandeln. Ansonsten läuft es jetzt.

Zum Thema *.ini noch. Hatte im ersten Anlauf binär gespeichert. Dies führte allerdings zu Problemen, da es mir irgendwie nicht möglich war Integer Werte aus anderen Klassen zu speichern. Da wurde dann immer nur der Zeiger auf den Wert gespeichert - der mir natürlich herzlich wenig nützt. Zum Zweiten hatte ich so einige Probleme mit dem Speichern, so konnte ich wenigstens sehen, was genau abgespeichert wurde.
 
Zurück