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



  • 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.



  • @ _matze:
    Ja, übertreiben kann mans immer. Ich mach Leerzeichen bei Klammern wie ( a + b ) eigentlich nie, eher (a + b) oder (a+b) . Die Abstände hangen meist davon ab, wie tief verschachtelt ein Ausdruck ist. Ich benutze sie also, um Priorität zu verdeutlichen:

    b += 2*(a+3) - 3*i;
    

    Auch unnötige Klammern bei AND und OR verwende ich kaum. Wird dabei eine If-Bedingung komplizierter, verlagere ich sie in mehrere Zeilen. Das kommt aber recht selten vor.



  • ich mache das eigemtlich genauso. um nochmal zum eigentlichen problem zurückzukommen, mein programm funktioniert jetzt bis auf einen kleinen fehler den ich gerne noch beheben würde aber nicht finde: beim einwurf in zeile 5 spalte 3 passiert einfach garnichts, 5 4 geht wieder und bei 5 5 werden dann leider 5 3 und 5 5 gefüllt(erstaunlicherweise richtig, nur verspätet 😕 ). alles andere funktioniert soweit hervorragend und der code(der oben ist der neueste) hat jetzt auch nur noch 308 Zeilen(!), der fehler ist das einzige problem das ich noch beheben muss.

    bloß wiedermal finde ich ihn nicht 😮 .

    mfg,
    andi01.



  • andi01 schrieb:

    beim einwurf in zeile 5 spalte 3 passiert einfach garnichts, ...

    Doch, da passiert schon was : 🙂

    // VierGewinnt.cpp zeile 18:
    cout<<"3: (...) <<position[3][4]<<" "<<position[1][5]<<" "<<position[3][6]<< (...)
    


  • Nexus schrieb:

    @ _matze:
    Ja, übertreiben kann mans immer. Ich mach Leerzeichen bei Klammern wie ( a + b ) eigentlich nie, eher (a + b) oder (a+b) . Die Abstände hangen meist davon ab, wie tief verschachtelt ein Ausdruck ist. Ich benutze sie also, um Priorität zu verdeutlichen:

    b += 2*(a+3) - 3*i;
    

    Auch unnötige Klammern bei AND und OR verwende ich kaum. Wird dabei eine If-Bedingung komplizierter, verlagere ich sie in mehrere Zeilen. Das kommt aber recht selten vor.

    Ja, finde ich vernünftig. Im Wesentlichen teile ich deine Ansicht (auch wenn bei mir noch ein paar Leerzeichen mehr verschwinden würden 😉 , dein Beispiel würde bei mir ohne Leerzeichen auskommen; wird's komplexer, werden sie auch passend eingefügt).



  • +gjm+ schrieb:

    andi01 schrieb:

    beim einwurf in zeile 5 spalte 3 passiert einfach garnichts, ...

    Doch, da passiert schon was : 🙂

    // VierGewinnt.cpp zeile 18:
    cout<<"3: (...) <<position[3][4]<<" "<<position[1][5]<<" "<<position[3][6]<< (...)
    

    also irgendwie muss beim upload was schifgegeangen sein oder so, bei mir im code ist das nicht der Fall:

    //Z.18:
    cout<<"3: "<<position[3][0]<<" "<<position[3][1]<<" "<<position[3][2]<<" "<<position[3][3]<<" "<<position[3][4]<<" "<<position[1][5]<<" "<<position[3][6]<<endl<<endl;
    

    hier habe ich nochmal die aktuelleste version upgeloadet: http://rapidshare.com/files/273072488/VierGewinnt.cpp.html

    leider besteht das problem weiterhin, das ist doch echt zum verzweifeln.



  • Meine güte, poste den code doch @ codepaste.org oder so, keine lust jedes mal bei rapidshit zu warten.



  • Soso : 🙂

    andi01 schrieb:

    //Z.18:
    cout<<"3: "<<position[3][0]<<" "<<position[3][1]<<" "<<position[3][2]<<" "<<position[3][3]<<" "<<position[3][4]<<" "<<position[1][5]<<" "<<position[3][6]<<endl<<endl;


Anmelden zum Antworten