zu viele || in if-bedingung???[gelöst]



  • andi01 schrieb:

    (natürlich ist das nicht das original-problem sondern eine vereinfachte Variante mit kleineren Zahlen und ein paar oders weniger

    Und genau das ist das Problem! 😉

    Poste mal den Original-Code, dann finden wir den Fehler sicher. Wahrscheinlich haben deine Variablen nicht die Werte, die du annimmst. Im Zweifelsfall einfach mal einen Breakpoint setzen und alle Werte überprüfen.



  • naja, der ist im ganzen viel zu lang und stammt aus einem 4-gewinnt-spiel, das hier sind zumindest die wesentlichen Ausschnitte:

    zuerst mal die dekleration der Klasse Position:

    class Position
    {
    public:
    	char farbe;
    };
    

    nun die funktion aktualisieren():

    void aktualisieren()
    {
    	//alte Ausgaben löschen:
    	system("cls");
    	//cout A1.farbe<<B1.farbe...:
    	cout<<"A: "<<A1.farbe<<" "<<A2.farbe<<" "<<A3.farbe<<" "<<A4.farbe<<" "<<A5.farbe<<" "<<A6.farbe<<" "<<A7.farbe<<endl<<endl;
    	cout<<"B: "<<B1.farbe<<" "<<B2.farbe<<" "<<B3.farbe<<" "<<B4.farbe<<" "<<B5.farbe<<" "<<B6.farbe<<" "<<B7.farbe<<endl<<endl;
    	cout<<"C: "<<C1.farbe<<" "<<C2.farbe<<" "<<C3.farbe<<" "<<C4.farbe<<" "<<C5.farbe<<" "<<C6.farbe<<" "<<C7.farbe<<endl<<endl;
    	cout<<"D: "<<D1.farbe<<" "<<D2.farbe<<" "<<D3.farbe<<" "<<D4.farbe<<" "<<D5.farbe<<" "<<D6.farbe<<" "<<D7.farbe<<endl<<endl;
    	cout<<"E: "<<E1.farbe<<" "<<E2.farbe<<" "<<E3.farbe<<" "<<E4.farbe<<" "<<E5.farbe<<" "<<E6.farbe<<" "<<E7.farbe<<endl<<endl;
    	cout<<"F: "<<F1.farbe<<" "<<F2.farbe<<" "<<F3.farbe<<" "<<F4.farbe<<" "<<F5.farbe<<" "<<F6.farbe<<" "<<F7.farbe<<endl<<endl;
    	cout<<"   1 2 3 4 5 6 7 "<<endl;
    }
    

    nun der wesentliche Teil aus spielerzug()(auf reihe 1 reduziert da der code aller reihen gleich ist):

    cout<<"\n\nSpieler 1: Bitte geben Sie die Reihe ein in die Sie einwerfen moechten!\n";
    	int reihe;
    	cin>>reihe;
    	//für Reihe 1:
    	if(reihe==1)
    	{
    		if(F1.farbe==' ')
    		{
    			F1.farbe='R';
    		}
    		else
    		{
    		if(F1.farbe!=' '&&E1.farbe==' ')
    		{
    			E1.farbe='R';
    		}
    		else
    		{
    		if((F1.farbe!=' ')&&(E1.farbe!=' ')&&(D1.farbe==' '))
    		{
    			D1.farbe='R';
    		}
    		else
    		{
    		if((F1.farbe!=' ')&&(E1.farbe!=' ')&&(D1.farbe!=' ')&&(C1.farbe==' '))
    		{
    			C1.farbe='R';
    		}
    		else
    		{
    		if((F1.farbe!=' ')&&(E1.farbe!=' ')&&(D1.farbe!=' ')&&(C1.farbe=!' ')&&(B1.farbe==' '))
    		{
    			B1.farbe='R';
    		}
    		else
    		{
    		if((F1.farbe!=' ')&&(E1.farbe!=' ')&&(D1.farbe!=' ')&&(C1.farbe=!' ')&&(B1.farbe!=' ')&&(A1.farbe==' '))
    		{
    			A1.farbe='R';
    		}
    		}
    		}
    		}
    		}
    		}
    	}
    

    (spieler2_zug() ist dasselbe wie spielerzug() nur mit B statt R als Farbe)
    und nun noch der entscheidende Teil aus main():

    A1.farbe=' ';
    	A2.farbe=' ';
    	A3.farbe=' ';
    	A4.farbe=' ';
    	A5.farbe=' ';
    	A6.farbe=' ';
    	A7.farbe=' ';
    
    	B1.farbe=' ';
    	B2.farbe=' ';
    	B3.farbe=' ';
    	B4.farbe=' ';
    	B5.farbe=' ';
    	B6.farbe=' ';
    	B7.farbe=' ';
    
    	C1.farbe=' ';
    	C2.farbe=' ';
    	C3.farbe=' ';
    	C4.farbe=' ';
    	C5.farbe=' ';
    	C6.farbe=' ';
    	C7.farbe=' ';
    
    	D1.farbe=' ';
    	D2.farbe=' ';
    	D3.farbe=' ';
    	D4.farbe=' ';
    	D5.farbe=' ';
    	D6.farbe=' ';
    	D7.farbe=' ';
    
    	E1.farbe=' ';
    	E2.farbe=' ';
    	E3.farbe=' ';
    	E4.farbe=' ';
    	E5.farbe=' ';
    	E6.farbe=' ';
    	E7.farbe=' ';
    
    	F1.farbe=' ';
    	F2.farbe=' ';
    	F3.farbe=' ';
    	F4.farbe=' ';
    	F5.farbe=' ';
    	F6.farbe=' ';
    	F7.farbe=' ';
    
    aktualisieren();
    for(;;)
    {
    spielerzug();
    aktualisieren();
    spieler2_zug();
    aktualisieren();
    }
    

    es gibt noch diverse weitere funktionen die zB den gewinn überprüen usw, die sind hier aber weggelassen weil das problem bereits bei den spielerzügen der Fall ist: Die ersten 3 virtuellen Steine lassen sich gut in einer Reihe setzen, der vierte lässt sich noch setzen und wenn man zum 5.mal einen stein setzt wird der vierte gelöscht 😮 und es sind noch 3 da, ab dann leiebns immer 3.

    ich dachte erst es läge an der (hier weggelassenen) Funktion gewinntest() die testet ob man gewonnen hat aber das problem entsteht offenbar schon davor.

    mfg,
    andi01.

    edit: wenn jemand das komplette programm testen möchte und den ganzen code haben will:

    Code(zum download upgeloadet): http://rapidshare.com/files/272631101/test.cpp.html
    Exe-datei: http://rapidshare.com/files/272631580/test.exe.html



  • Wie wärs mit Arrays?



  • naja könnte ich zwar machen aber ich glaube kaum dass das was ändern würde, ich denke mal der fehler liegt eher irgendwo in den eingabebefehlen. aber ich probiers trotzdem mal, vielleicht gehts ja dann doch 🙂 . in der zwischenzeit könnt ihr wenn ihr wollt ja schonmal den completten code runterladen vllt lässt sich dann der fehler ja besser finden.



  • also ich habe jetzt die klassenvariablen durch ein gleichnamiges array position ersetzt, was aber, wie ja zu erwarten war 😞 , das resultat kein bisschen verändert hat. es muss also am code für die eingabe liegen.

    neue upgeloadete datein(da der quellcode viel zu lang zum hierposten wäre):

    .cpp : http://rapidshare.com/files/272645320/test.cpp.html
    .exe : http://rapidshare.com/files/272645738/test.exe.html

    ich habe meinen code jetzt nochmal genau durchgeschaut aber ich kann den fehler einfach nicht finden 😞 .
    hier nochmal die genaue problembeschreibung während des spiels: die cpp-datei kompilert einwandfrei, ohne errors/warnings etc. . im spiel kann man ja maximal 5 steine in eine reihe einwerfen. die ersten drei lassen sich auch völlig problemlos einwerfen. wirft man den 4. ein geht das auch noch, aber wenn man den 5. einwrft wird der 4. gelöscht 😕 und die ersten 3 bleiben stehen, danach verändert sich an der reihe gar nichts mehr wenn man weitere steine einwirft. diese problem betrift leider alle reihen.

    das lässt allerdings darauf schließen, dass mein fehler irgendwo in dem teil liegen muss, in dem der pc die eingeworfenen steine verarbeitet und positioniert. allerdings habe ich im gesamten code trotz mehrmaliger suche keine fehler findenkönnen 😞 .

    mfg,
    andi01.



  • andi01 schrieb:

    allerdings habe ich im gesamten code trotz mehrmaliger suche keine fehler findenkönnen 😞 .

    Wie suchst du denn? Indem du den Code immer wieder durchliest? Nutze den Debugger, setze Breakpoints, gehe Schriitt für Schritt durch das Programm (zur Laufzeit!) und überprüfe die Inhalte deiner Variablen. Dann kommst du sicher ganz schnell drauf.



  • andi01 schrieb:

    naja könnte ich zwar machen aber ich glaube kaum dass das was ändern würde

    außer, dass dein Code lesbarer und wesentlich(!) kürzer wird 🙂



  • andi01 schrieb:

    ich habe meinen code jetzt nochmal genau durchgeschaut aber ich kann den fehler einfach nicht finden 😞

    Was "vergleicht" der folgende Ausdruck : 🙂

    // test.cpp zeile 56:
    ... &&(position[2][0]=!' ')&& ...
    


  • @_matze:natürlich lese ich den code nicht einfach immer nur durch, aber die variablen werden ja sowieso nach jedem zug von einem spieler durch aktualiseren() ausgegeben mit dem im vorherigen beitrag beschriebenen resultat. der code funktioniert wunderbar bis zum 5.einwurf. ich kann mir einfach nicht erklären warum immer einwurf nr. 4 gelöscht wird, denn eigentlich ist der code für alle einwürfe nahezu gleich, absolut keine ahnung warum das programm genau da nicht tut was es soll, ich kann aber an dieser stelle einfach keinen fehler finden, egal mit welcher methode.

    @otze: ja der code ist in der tat etwas kürzer und übersichtlicher geworden 🙂

    Ich habe auch mit breakpoints schon einzelne passagen getestet, immer mit demselben restultat: setze ich den breakpoint vor einwurf nr.5 geht alles einwandfrei, setze ich ihn danach tritt dieser fehler auf. jetzt weiß ich zwar wo er höchstwahrscheinlich liegt, kann ihn aber immernoch nicht finden.der code compilert fehler- und warningfrei und auch beim debuggen kann ich den fehler nicht finden. Das ist doch echt unglaublich, ich weiß genau in welchen paar zeilen code der fehler liegen muss bin aber nicht in der lage ihn zu finden 😞

    mfg,
    andi01.



  • Siehe einen Post oberhalb. 😉



  • Der Fehler wurde ja gerade genannt, du hast da nur was durcheinander gebracht... 🙂

    Sieh mal ganz genau hin! ⚠



  • @+gjm+ und Nexus:
    der zitierte Ausdruck vergleicht ob an dieser stelle bereits eine Farbe (Rot R oder Blau 😎 definiert wurde und somit der Einwurf eines virtuellen Chips bereits stattgefunden hat( denn wenn ja ist position[...][...]mit R oder B belegt, wenn nein mit ' ');
    somit weiß das Programm wenn der user eingiebt in zeile 1 einwerfen in welcher höhe (0,1,2,3,4,5) der chip platziert werden soll.

    was soll daran falsch sein?

    mfg,
    andi01.



  • andi01 schrieb:

    @+gjm+ und Nexus:
    der zitierte Ausdruck vergleicht ob an dieser stelle bereits eine Farbe (Rot R oder Blau 😎 definiert wurde und somit der Einwurf eines virtuellen Chips bereits stattgefunden hat( denn wenn ja ist position[...][...]mit R oder B belegt, wenn nein mit ' ');
    somit weiß das Programm wenn der user eingiebt in zeile 1 einwerfen in welcher höhe (0,1,2,3,4,5) der chip platziert werden soll.

    Nö, da wird nicht verglichen, sondern zugewiesen. :p



  • oh, stimmt!!! danke, das habe ich bisher völlig übersehen=) ich werds gleich mal ausbessern
    😃 tja so einfach kann der fehler sein und man sucht manchmal ewig um ihn zu finden 😃

    ich bessere das gleich mal aus und sage euch dann obs geht.

    edit: danke, jetzt funktioniert der Code perfekt!

    danke für die ganzen Antworten,
    andi01.



  • C++ ist besonders heimtückisch, was solche Fehler angeht. Grundsätzlich rate ich dir, Leerzeichen zu setzen. Dadurch heben sich Operatoren besonders ab.

    Das sieht doch sofort merkwürdig aus:

    ... && (position[2][0] =! ' ') && ...
    


  • Nexus schrieb:

    C++ ist besonders heimtückisch, was solche Fehler angeht. Grundsätzlich rate ich dir, Leerzeichen zu setzen. Dadurch heben sich Operatoren besonders ab.

    Das sieht doch sofort merkwürdig aus:

    ... && (position[2][0] =! ' ') && ...
    

    Hm, Ansichtssache. Ich hab's früher auch mal so versucht, aber irgendwie macht der übermäßige Gebrauch von Leerzeichen den Code deutlich schlechter lesbar für mich. Ganz schlimm finde ich es, wenn Leute dies auf die Spitze treiben:

    while ( ( c = getchar() ) != '\n' && ( c != EOF ) )
    

    Mann, können die nicht einfach ihren Editor auf größeren Zeichenabstand einstellen oder so?! 😃

    Na ja, eben Ansichtssache... 🙂



  • an einigen wichtigen Stellen können Leerzeichen ganz hilfreich sein, aber zu viele machen den code dann auch wieder unleserlich und unnötig lang(vorallem bei langen codes bedeutet das dann ja fast doppelte Länge!). Man darf es halt nicht übertreiben, aber in Maßen ist das durchaus sinnvoll. Ich werde in zukunft die leerzeichen gezielt an wichtigen stellen verwenden.

    danke nochmal für die ganzen antworten,
    andi01.



  • _matze schrieb:

    Ganz schlimm finde ich es, wenn Leute dies auf die Spitze treiben:

    while ( ( c = getchar() ) != '\n' && ( c != EOF ) )
    

    So hätt ichs gemacht:

    while ((c = getchar()) != '\n' && c != EOF)
    

    Und andi01, Arrays sind so toll, weil man die Indices mit Variablen durchlaufen kann. So wie du es für das leeren des Spielfeldes gemacht hast, kannst du es auch für die Überprüfung auf einen Sieg und auch auf das Steinelegen übertragen.
    Zudem ist deine Überprüfung in gewonnen() nicht korrekt. ( a==b==c macht wohl nicht das, was du möchtest) Zudem heißt das Spiel VierGewinnt 😉

    Also eine elegantere Lösung kommt auf nichtmal 100 Zeilen. (und nein, dass sind keine tausend-Zeichen-Zeilen...)



  • jo in meiner aktuellsten version habe ich das auch überarbeitet(ist aber immnoch nicht ganz fertig), habe ich bloß hier nichmehr reingeschriebn:

    .cpp: http://rapidshare.com/files/272978233/VierGewinnt.cpp.html
    .exe: http://rapidshare.com/files/272978701/VierGewinnt.exe.html

    aber auch das is noch nicht ganz fertig.

    mfg,
    andi01.



  • edit: jetzt ist es nochmal überarbeitet:

    jetzt gesamt nur noch 308 zeilen code!

    .cpp: http://rapidshare.com/files/273039570/VierGewinnt.cpp.html
    .exe: http://rapidshare.com/files/273039252/VierGewinnt.exe.html

    edit: es gibt nur 1 problem: bein einwurf an stelle 3 5 passiert gar nix.

    mfg,
    andi01.


Anmelden zum Antworten