Damebrettspiel - Speicherzugriffsfehler



  • felix92 schrieb:

    @Th69 Debugger spuckt mir nur die Warnung aus das [10][10] kein Char ist immer wenn es aufgerufen wird !

    ... und das zu Recht. Board geht von 0 bis 9 , Board[10][10] ist schon Speicher, der dir nicht gehört.

    felix92 schrieb:

    @Schlangenmensch sry für die wahrscheinlich doofe Frage aber wie meinst du das?

    Board[EN][EC] = Board[SN][SC];
       Board[SN][SC] = 0;
       cout << "Ihr Zug ist gueltig !" << endl;
    

    Du greifst hier lustig auf alle möglihen Speicherbereiche zu, nur weils der Benutzer eingibt. Prüfe zuerst, ob das Eingegebene überhaupt im Bereich von Brett liegt.



  • felix92 schrieb:

    @Th69 Debugger spuckt mir nur die Warnung aus das [10][10] kein Char ist immer wenn es aufgerufen wird

    Glaub ich, [10][10] gibt es auch nicht.



  • Also quasi [10][10] auf [0][9] ändern ? 😕 😕 aber dann gibt er mir doch ein falsches "Brett" aus 😕
    Sry aber verstehe das nicht so ganz ist der Speicher nicht frei für alle anstehenden Aufgaben ?



  • Irgendwo wirst du wohl über die Arraygrenzen [9][9] hinausgehen. Aber da hilft dir der Debugger weiter, Step für Step durchgehen.



  • Der gibt mir halt nur aus das [10][10] kein Char ist als Warnung funktionieren tut es ja für maximal 5 Züge 😞



  • Dein lieber Debugger sagt Dir doch sicher aus, wo Du auf Brett[10][10] zugreifst ...



  • felix92 schrieb:

    Der gibt mir halt nur aus das [10][10] kein Char ist als Warnung funktionieren tut es ja für maximal 5 Züge 😞

    Das ist der Compiler. Wenn du deinen Code im Debugger ausführst, sagt der dir, wo er raus fliegt.
    Da wir in einem C++ Forum sind, könntest du auch über die Verwendung von std::array nachdenken und mit at() zugreifen, das schmeißt eine Exception, wenn du außerhalb deiner Grenzen bist.

    Ich habe keine Lust, deine Logik nachzuvollziehen, aber, wenn du nur erlaubte Züge machst, würde ich mir mal die Randbedingungen anschauen. Vor allem, wenn du einen anderen Stein schlägst, da rechnest du einen Index hoch. Das sieht verdächtig aus.



  • Wichtig für dich vielleicht auch noch: wenn du einmal was falsches eingegeben hast, ist der ifstream "cin" im Failed-Status und nachfolgende Einleseoperationen finden dann nicht mehr statt.

    Schau dir vielleicht mal die Clear-Funktion an:
    http://en.cppreference.com/w/cpp/io/basic_ios/clear
    http://www.cplusplus.com/reference/ios/basic_ios/clear/



  • felix92 schrieb:

    Also quasi [10][10] auf [0][9] ändern ?

    Hä was? NEIN! Du verstehst es wirklich nicht oder? Du legst das Array Board mit 10 Zeilen und 10 Spalten an. Du willst aber später auf die 11. Zeile und die 11. Spalte zugreifen. Wie soll das gehen?! Es wird bei 0 angefangen zu zählen, das heißt dein maximaler Zugriffsbereich ist Board[9][9]...



  • Ich habe folgende Vermutung:
    die COMPILER-Warnmeldung zu dem Feld[10][10] wird hier als DEBUGGER-Fehlermeldung dargestellt. Daher vermutet hier jeder, dass es wirklich um einen Debugger ging, der tatsächlich gar nicht im Spiel war. Ich habs jetzt mal diverse Züge lang gespielt und wenn man keine Fehleingaben macht, kommt man schon weit - es ist bislang nicht abgestürzt. Daher denke ich, dass der Fehler von dem fehlenden Clear nach Fehleingaben und der darauf folgenden Endlosrekursion kommt.

    Mir ist noch was aufgefallen:
    a) Doppelsprünge sind nicht möglich, man kann also nicht 2 Figuren schlagen.
    b) Sprünge sind nicht pflicht. Ich kenne Dame so, dass man schlagen muss, wenn man kann.



  • Ja gut konntest du nicht wissen aber das ist gewollt so laut der Aufgabe 🙂 mein Problem liegt wirklich nur noch darin das der Speicherzugriffsfehler nicht mehr auftritt !? Um ehrlich zu sein verstehe ich auch garnicht warum das passiert bzw. wo der Fehler liegt 😕


Anmelden zum Antworten