Klasse ValueGets: Fehler!



  • derNichtswissende schrieb:

    bei meinen Variablen funktioniert etwas nicht..

    Für Genaueres muss man erst Geld in dich werfen?



  • Michael E. schrieb:

    derNichtswissende schrieb:

    bei meinen Variablen funktioniert etwas nicht..

    Für Genaueres muss man erst Geld in dich werfen?

    nein 😞
    Ich hab es so gut wie möglich erklärt, aber besser gehts nicht.

    1. Also ich will in Mainblabla(...), User1(..) aufrufen.
    2. User1(...) beinahaltet die eingabe des Benutzers. Der Benutzer gibt also zwei Zahlen ein.
    3. In der User1(...) wird nun Steuerung(..) aufgerufen.
    4. Steuerung(...) enthält IF-Abfragen und wenn diese true ergeben, dann wird etwas gemacht, zbsp. dass free[last] auf einmal free[first + 5] ist.
    5. Dann wird in Mainblabla(...) die Funktion ZeigList(..) aufgerufen, das so aussieht:

    void ZeigList(std::vector<char> free)
    {
    for(/* Bedingung usw.. */)
    {
    std::cout << free[x];
    //...
    }
    //..
    }
    


  • bitte vergesst mich nicht 😞



  • Du solltest nicht den Code beschreiben, sondern den Fehler. Kriegst du nen Compilerfehler? Ne Exception? Wild ins Blaue geraten hast du nen Index außerhalb der Grenzen.



  • keinen kompilierungsfehler, keine exception, nichts.
    Es funktioniert wunderbar, nur,dass es nicht richtig übergeben wird,also first und last werden nicht richtig übergeben, sodass wenn man sie in Mainblabla()aufruft, dass sie dort auch ihre Wirkung zeigen 😉
    first und last hab ich dann so als Referenz geschrieben:

    int ValueGets::User2(std::vector<char> &free, int &first, int &last)
    

    hat aber auch nicht besonders viel geholfen.
    Was wären noch für offene Möglichkeiten? This-Zeiger?

    mfg



  • Hm? first und last hast du doch als Member deiner Klasse, die brauchst du doch nicht zu übergeben. Was heißt "ihre Wirkung zeigen"?



  • Ich verstehs auch nicht so ganz 😃 Hast dir aber Mühe gegeben bei der Beschreibung, das verdient ein 👍

    Sollen "first" und "last" an eine fremde Funktion oder Klasse übergeben werden oder an eine, die in der Klasse ValueGets existiert?



  • Badestrand schrieb:

    Ich verstehs auch nicht so ganz 😃 Hast dir aber Mühe gegeben bei der Beschreibung, das verdient ein 👍

    Danke, ich habs nur so gut erklärt, wie möglich 😉

    Badestrand schrieb:

    Sollen "first" und "last" an eine fremde Funktion oder Klasse übergeben werden oder an eine, die in der Klasse ValueGets existiert?

    nein, die Funktion(en) befindet bzw. befinden sich in meiner Klasse, ValueGets 😉

    class ValueGets
    {
    public:
    void Mainblabla(std::vector<char> free);
    int User1(std::vector<char> &free);
    int User2(std::vector<char> &free);
    int Steuerung(std::vector<char> &free); // Hier wird geprüft, ob die Eingaben in User1 und User2 so eingegeben wurden, wie vorausgesetzt.
    

    (zbsp. wenn hier die Zahl 2 und 4 vorausgesetzt ist und man, 2 und 4 eingibt[in User1() und User2()],dann passiert irgendwas zbsp. free[2] wird dann free[4], in dem Fall also free[first] = free[last];

    // Ende von Public und begin von private:
    private:
    std::vector<char> free;
    int first, last;
    };
    

    das gleiche würd ich mit first und last anstellen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-188047-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

    Nur betrifft das free leider.
    Aso hab noch was vergessen zu sagen.. ich bin der Threadersteller von meinem Link da im Thread, heiß also Thomas 😃

    Also beim vorigen hab ich eine Referenz in der Funktion machen müssen, anstatt nen normalen Vektor:

    class Test 
    { 
    public: 
    void output_int(const std::vector<int>& Ger); 
    void eingabe(std::vector<int>& Ger); 
    void ausgabe(std::vector<int> Ger); 
    
    private: 
    int e1, e2; 
    }; 
    
    void Test::output_int(const std::vector<int>& Ger) 
    { 
    for(int etwas = 0; etwas != Ger.size(); ++etwas) 
    { 
    std::cout << Ger[etwas] << std::endl; 
    } 
    } 
    
    void Test::eingabe(std::vector<int>& Ger) 
    { 
    std::cin >> e1 >> e2; 
    Ger[e1] = Ger[e2]; 
    } 
    
    void Test::ausgabe(std::vector<int> Ger) 
    { 
    output(Ger); 
    eingabe(Ger); 
    output(Ger); 
    }
    

    Mfg



  • dernichtswissende@Thomas schrieb:

    Badestrand schrieb:

    Ich verstehs auch nicht so ganz 😃 Hast dir aber Mühe gegeben bei der Beschreibung, das verdient ein 👍

    Danke, ich habs nur so gut erklärt, wie möglich 😉

    Randfrage: Und an welcher Stelle passiert nicht das, was du erwartet hast?

    class ValueGets
    {
    public:
    void Mainblabla(std::vector<char> free);
    int User1(std::vector<char> &free);
    int User2(std::vector<char> &free);
    int Steuerung(std::vector<char> &free); // Hier wird geprüft, ob die Eingaben in User1 und User2 so eingegeben wurden, wie vorausgesetzt.
    

    (zbsp. wenn hier die Zahl 2 und 4 vorausgesetzt ist und man, 2 und 4 eingibt[in User1() und User2()],dann passiert irgendwas zbsp. free[2] wird dann free[4], in dem Fall also free[first] = free[last];

    // Ende von Public und begin von private:
    private:
    std::vector<char> free;
    int first, last;
    };
    

    Dir ist klar, daß das Klassenelement 'free' absolut nichts mit dem Parameter zu tun hat, den du zwischen deinen Methoden austauschst?



  • CStoll schrieb:

    dernichtswissende@Thomas schrieb:

    Badestrand schrieb:

    Ich verstehs auch nicht so ganz 😃 Hast dir aber Mühe gegeben bei der Beschreibung, das verdient ein 👍

    Danke, ich habs nur so gut erklärt, wie möglich 😉

    Randfrage: Und an welcher Stelle passiert nicht das, was du erwartet hast?

    class ValueGets
    {
    public:
    void Mainblabla(std::vector<char> free);
    int User1(std::vector<char> &free);
    int User2(std::vector<char> &free);
    int Steuerung(std::vector<char> &free); // Hier wird geprüft, ob die Eingaben in User1 und User2 so eingegeben wurden, wie vorausgesetzt.
    

    (zbsp. wenn hier die Zahl 2 und 4 vorausgesetzt ist und man, 2 und 4 eingibt[in User1() und User2()],dann passiert irgendwas zbsp. free[2] wird dann free[4], in dem Fall also free[first] = free[last];

    // Ende von Public und begin von private:
    private:
    std::vector<char> free;
    int first, last;
    };
    

    Dir ist klar, daß das Klassenelement 'free' absolut nichts mit dem Parameter zu tun hat, den du zwischen deinen Methoden austauschst?

    in Mainblabla(..) wenn ich eine Funktion aufrufe, die

    for(int etwas = 0; etwas != free.size(); ++etwas) 
    { 
    std::cout << free[etwas] << std::endl; 
    }
    

    beinhaltet. Sie sollte normalerweise an einer anderen Position sein usw..
    Erklärt es mir bitte bzw. helft mir, ich hab einen fehler, den ich nicht finde..

    Also nochmal:

    Das "Gebiet" bzw. "Feld" sieht so aus:

    A B C D E F G
    

    So nun wird das in Mainblabla aufgerufen.. also mit free=>(vector<char> free)..
    dann wird User1 darum nach zwei Zahlen gefragt. Dann wird noch dazu in User1 die Funktion Steuerung(), aufgerufen. Sie beinhaltet sowas wie zbsp. dass wenn der Benutzer 1 und dann 5 eingibt, dann vom elemtent 1 zum Element 5 im Vektor ein Buchstabe erscheint.
    Zbsp. hat der Vektor wie oben, 7 Elemente:

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

    dass wenn zbsp. alles andere außer 1 und 5 eingegeben wird, dass eine entsprechende Fehlermeldung mit cout ausgegeben wird.
    Wenn zbsp. 1 und 5 eingegeben wurde, sieht das so aus(first = 1, last = 5)

    A B C D E [b][u]B[/u][/b] G
    0 1 2 3 4 5 6
    

    Haben Sie mich nun verstanden? 😉

    Mit freundlichen Gruessen
    Thomas



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



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

    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 😃

    Aso, und ich glaube, du brauchst keinen hier zu Siezen 😉



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


Anmelden zum Antworten