zu viele || in if-bedingung???[gelöst]
-
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.htmlich 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 ingewonnen()nicht korrekt. (a==b==cmacht 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.htmlaber 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.htmledit: 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]<< (...)