Klasse ValueGets: Fehler!



  • CStoll schrieb:

    OK, ich glaube, jetzt habe ich verstanden, was die Funktion machen soll - aber was macht sie tatsächlich?

    Badestrand schrieb:

    Ich habs nicht ganz verstanden 😞
    Also es gibt eine Menge an Buchstaben. Es gibt zwei Benutzer, die jeweils zwei Zahlen eingeben müssen/wollen/sollen. Die Menge der Buchstaben soll dann, abhängig von der Eingabe, modifiziert werden. Stimmt das so 😕

    Ja, aber nur wenn man bei der Eingabe in User1() und User2() bestimmtest eingibt, dann funktioniert dann auch.

    Badestrand schrieb:

    Und das Problem dabei ist, dass in Steuerung die Variablen first und last nicht das enthalten, was sie enthalten sollen? Oder wie? Ich verstehe nicht ganz, wo jetzt der Fehler ist, oder welcher Teil des Programmes sich nicht so verhält, wie er soll 😃

    Ich glaube,das Problem ist eher,dass die Variablen als lokale Variablen behandelt werden und sich deswegen nichts tut, obwohl ich das in der Funktion Steuerung() mit der If Abfrage und mittendrinn(in der IfAnweisung) noch das
    free[first] = free[last]; reingeschrieben hab 😞
    Es ist glaub ich einfach nur,weil ich keine Referenzen oder sonstiges gemacht hab, aber obwohl ich es schon versucht hab,funktionierts immer noch nicht.
    Also d.h dass sich von

    A B C D E F G
    0 1 2 3 4 5 6
    

    auf

    A B C D E B G
    0 1 2 3 4 5 6
    

    nicht ändert, weil ich keine Referenzen oder Zeiger oder was auch immer an bestimmte Funktionen nicht übergeben hab..

    Mfg



  • class ValueGets
    {
    public:
        void Mainblabla(std::vector<char> free);
        int User1(std::vector<char> &free);
        int User2(std::vector<char> &free);
    
    private:
        int first, last;
    };
    
    void ValueGets::Mainblabla(std::vector<char> free)
    {
        while(std::cin)
        {
            ZeigListe(free);
            User1(free);
            ZeigListe(free);
            User2(free);
        }
    }
    
    int ValueGets::User1(std::vector<char> &free)
    {
        std::cout << "Spieler 1 first: ";
        std::cin >> first;
        std::cout << std::endl << "Spieler 1 last: ";
        std::cin >> last;
        std::cout << std::endl;
        Steuerung(free);
        return 1;
        // Willst du hier nix mit dem Ergebnis von Steuerung anstellen?
        // Also z.B.
        // return Steuerung( free );
        // ?
    }
    
    int ValueGets::User2(std::vector<char> &free)
    {
        std::cout << "Spieler 2 first: ";
        std::cin >> first;
        std::cout << std::endl << "Spieler 2 last: ";
        std::cin >> last;
        std::cout << std::endl;
        Steuerung(free);
        return 1;
        // und hier auch.. :)
    }
    
    int ValueGets::Steuerung(std::vector<char> &free)
    {
        std::cout << "ValueGets::Steuerung: first=" << first << "; last=" << last << endl;
        if(/*...*/)
        {
            if(last == first - 15)
            {
                free[last - 4] = free[first - 15];
                free[first] = 'G';
                return free[last - 4];
            } else {
                std::cout << "Fehler in der Einstellung." << std::endl;
                return 0;
            }
        } else {
            std::cout << "Deaktiviert. " << std::endl;
            return 0;
        }
    }
    

    Und irgendwo (ich glaube vor der Eingabe) muss evtl noch ein cin::ignore(...) rein.

    Ich hab hier nur die Ausgabe in Steuerung eingefügt und einen Kommentar. Wär nett, wenn du dann beschreibst, was davon nicht das tut, was es soll 😉



  • funktioniert trotz des return Steuerung(free); noch immer nicht 😞



  • was genau spucken denn die Hilfsausgaben aus, die Badestrand dort eingebaut hat? (btw, wenn verfügbar, solltest du das Programm mal durch den Debugger laufen lassen)



  • Es funktioniert nur,wenn ich die IF-Anweisung,also

    if(/*...*/)
        {
            if(last == first - 15)
            {
                free[last - 4] = free[first - 15];
                free[first] = 'G';
                //return free[last - 4]; ohne return, weil void^^
            } else {
                std::cout << "Fehler in der Einstellung." << std::endl;
                //return 0;
            }
        } else {
            std::cout << "Deaktiviert. " << std::endl;
            //return 0;
        }
    

    in MainBlabla gleich einfüge..



  • Aber dir ist schon klar, dass first und last immer nur für einen Nutzer gültig sind? Also nachdem User2 eingegeben hat, dass dann die Eingabe des ersten weg ist? Und wo musst du sie in Mainblabla einfügen, damit es funktioniert?



  • da kommt immer die Antwort "Deaktiviert" also von der Else, obwohl es stimmt..



  • Thomas W. schrieb:

    da kommt immer die Antwort "Deaktiviert" also von der Else, obwohl es stimmt..

    Und was für Werte werden ausgepsuckt, wenn du am Anfang der Funktion den Inhalt von first und last ausgeben lässt?



  • CStoll schrieb:

    Thomas W. schrieb:

    da kommt immer die Antwort "Deaktiviert" also von der Else, obwohl es stimmt..

    Und was für Werte werden ausgepsuckt, wenn du am Anfang der Funktion den Inhalt von first und last ausgeben lässt?

    also die richtigen.
    Wenn ich zbsp. 1 und 25 eingebe, kommt 1 25 heraus, also eh das richtige.

    Aber ich glaube,dass ich das Problem schon gefunden hatte. In Steuerung() war so eine If-Anweisung:

    int ValueGets::Steuerung(std::vector<char> &free)
    {
        std::cout << "ValueGets::Steuerung: first=" << first << "; last=" << last << endl;
        if(/*...*/)
        {
            if(last == first - 15)
            {
                free[last - 4] = free[first - 15];
                free[first] = 'G';
                return free[last - 4];
            } else {
                std::cout << "Fehler in der Einstellung." << std::endl;
                return 0;
            }
        } else {
            std::cout << "Deaktiviert. " << std::endl;
            return 0;
        }
    }
    

    Also die mit dem Kommentar drinnen als Bedingung^^ if(/.../) wenn ich die und die else mitm Deaktiviert weglasse, funktionierts wunderbar:

    if(last = first ..)
    		{
    			//...
    		} else {
    			//..					}
    

    aber das würde mich nun wirklich interessieren, warum das nicht ging?!
    hmm sobald ich es herausgefunden habe,schreibe ich die Antwort 😉

    Danke allen herzlichst, die mitgeholfen haben 😉
    Mfg



  • Thomas W. schrieb:

    aber das würde mich nun wirklich interessieren, warum das nicht ging?!
    hmm sobald ich es herausgefunden habe,schreibe ich die Antwort 😉

    Vermutlich weil du die dortige Bedingung falsch formuliert hast (wenn du uns sagst, was (a) dort genau steht und (b) die Bedingung überprüfen soll, können wir auch Verbesserungsvorschläge machen).



  • CStoll schrieb:

    Thomas W. schrieb:

    aber das würde mich nun wirklich interessieren, warum das nicht ging?!
    hmm sobald ich es herausgefunden habe,schreibe ich die Antwort 😉

    Vermutlich weil du die dortige Bedingung falsch formuliert hast (wenn du uns sagst, was (a) dort genau steht und (b) die Bedingung überprüfen soll, können wir auch Verbesserungsvorschläge machen).

    ahso, du (od. ihr) wollt mir doch helfen? Danke, find ich echt nett 😉

    in der main.cpp(also anfangsdatei) hab ich eine globale Variable:

    unsigned char xx = 1; // Smiley
    

    das bringt schon was, auch wenn ich nur jetzt in der If so schreibe:

    if(free[first] == 1) // free ist ein vector vom Typ char, first ist ein Integer
    {
        //..
    }
    

    wenn ich die If-Anweisung weglasse, funzt alles perfekt, aber das will ich ja nicht ^^ die muss unbedingt da sein(gründe nenn ich erstmal nicht, werdet dann sehen, sobald ich fertig bin).

    Auch hab ich extra versucht noch dazu in der Klassen-headerdatei noch eine globale Variable zu machen um dann den Namen der Variable zu vergleichen:

    unsigned char abc = 1;
    ...
    
    if(free[first] == abc)
    {
        //..
    }
    

    funzt auch nicht^^

    Mfg



  • Und was für ein Wert steht an der Position 'first' in deinem vector?



  • Das kannst du übrigens auch generell so machen. Wenn dein Proggi aus irgendwelchen mysteriösen Gründen nicht in eine if-Abfrage eintritt, es aber sollte, ist es am Besten, dir die Werte ausgeben zu lassen:

    // Hier kannst du dann sehen, _warum_ die Bedingung nie erfüllt wird.
    cout << "if (x == y) -> x=" << x << "; y=" << y << endl;
    if ( x == y ) // hier die Bedingung stimmt nie
    {
       ...
    }
    

    Solche Testausgaben sind meiner Meinung nach verdammt wichtig, wenn man einen Fehler hat! Alternativ, wenn du dich mit dem Debugger auskennst, kannst du vor/an der Abfrage einen Breakpoint setzen. Da pausiert dann das Programm und du kannst dir alle Kontext-Variablen angucken, also auch, welche Werte x und y haben.
    🙂



  • leicht OT: Bin ich eigentlich der einzige, der eine leichte Gänsehaut bei einem Variablennamen "free" bekommt ?

    Ist zwar nicht verboten, würde ich aber trotzdem nicht machen....

    Gruß,

    Simon2.



  • CStoll schrieb:

    Und was für ein Wert steht an der Position 'first' in deinem vector?

    Den man zuerst eingegeben hat 😉
    also in Player1() usw..

    mfg



  • Wo kommt denn jetzt die 'Player1()' her? Bislang war nur von einer Methode 'User1()' die Rede - und die hat überhaupt nichts in deinen vector geschrieben.

    (*Vermutung hat* Kann es sein, daß du das Zeichen (char)1 (irgendein Steuerzeichen) verwechselst mit '1' (==(char)49)?)



  • CStoll schrieb:

    Wo kommt denn jetzt die 'Player1()' her? Bislang war nur von einer Methode 'User1()' die Rede - und die hat überhaupt nichts in deinen vector geschrieben.

    Sorry, ich meinte User1(), habs verwechselt 😞

    CStoll schrieb:

    (*Vermutung hat* Kann es sein, daß du das Zeichen (char)1 (irgendein Steuerzeichen) verwechselst mit '1' (==(char)49)?)

    unsigned char xxx = 1; // das ist das Smiley da in der ASCII Tabelle :)
    

    Mfg



  • dernichtswissende schrieb:

    CStoll schrieb:

    Wo kommt denn jetzt die 'Player1()' her? Bislang war nur von einer Methode 'User1()' die Rede - und die hat überhaupt nichts in deinen vector geschrieben.

    Sorry, ich meinte User1(), habs verwechselt 😞

    Also in der Version, die du oben gepostet hast, ändert die Methode User1() den übergebenen vector<> überhaupt nicht. Also nochmal: Was genau steht vor der rätselhaften if-Abfrage in free[first]?



  • CStoll schrieb:

    dernichtswissende schrieb:

    CStoll schrieb:

    Wo kommt denn jetzt die 'Player1()' her? Bislang war nur von einer Methode 'User1()' die Rede - und die hat überhaupt nichts in deinen vector geschrieben.

    Sorry, ich meinte User1(), habs verwechselt 😞

    Also in der Version, die du oben gepostet hast, ändert die Methode User1() den übergebenen vector<> überhaupt nicht. Also nochmal: Was genau steht vor der rätselhaften if-Abfrage in free[first]?

    eine Zahl, also vector<char> free ist bei Player1/Player2 eine Referenz. Dort wird also nichts kopiert. Der benutzer gibt zwei Zahlen ein; first ist in diesem Fall die Zahl, die der Benutzer eingegeben hat. Nun wird in Steuerung() überprüft, ob free[first] ein Smiley ist. Ist das der Fall, darf er seinen Zug machen 😉

    Es gibt ja ein Char-Feld:

    A B C D E F G H I J K L M N
    

    und A ist in dem Fall das Smiley,wenn der Benutzer 0 eingibt.



  • Mit solchen allgemeinen Aussagen ist weder dir noch uns geholfen. Du hast ein Problem mit der Tatsache, daß bei if(free[first]==1)...else... das Programm in den else-Zweig geht. Da an dem if() nichts kaputt sein sollte*, liegt der Fehler vermutlich an den Werten, die du verglichen hast. Also zum letzten Mal: Was für ein Wert steht vor dieser if()-Abfrage in free[first]? (und bitte kein Geeiere ala "der Wert, der am Programmanfang dort eingetragen wurde")

    * wenn doch, kannst du deinen Compiler in die Tonne treten

    PS: Wenn du dir nicht helfen lassen willst, sag Bescheid, dann kann ich hier dicht machen.


Anmelden zum Antworten