Klasse ValueGets: Fehler!



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



  • CStoll schrieb:

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

    Hey, ich finde er gibt sich wirklich Mühe! Auch wenn er nicht richtig erklären kann, was da nun vor sich geht und was nicht 🤡

    Darf ich mal raten, dass der vector<char> eine Art Spielfeld ist? Der Benutzer, der dran ist, gibt zwei Zahlen ein, Indizes des Vektors. Wenn der char-Wert beim ersten Index ein bestimmter Buchstabe ist (hier ASCII-Code 1), dann kann passiert irgendwas mit dem Wert beim zweiten Index.
    Vielleicht solltest du das Verfahren mit Worten beschreiben. Also z.B. das Spielprinzip - ich denke es wird schon keiner klauen 😉 Beim Beschreiben mit Worten solltest du dann von Funktionen, Referenzen usw loskommen und z.B. beschreiben, wie der Benutzer, der das Programm startet, es bedienen muss und was der Zweck des Programms ist.

    Dein Fehler liegt eindeutig in der Logik, wo du irgendwo falsch gedacht hast. Logikfehler lassen sich halt nur beheben, wenn man die Funktionsweise des Programmes versteht, was es wann tun soll, und vor allem warum.
    Wie ich das sehe, verstehen weder CStoll noch ich, wie, was, wo und warum genau irgendwo irgendwas passieren soll. Und deshalb bräuchten wir eine Beschreibung 😉



  • Badestrand schrieb:

    CStoll schrieb:

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

    Hey, ich finde er gibt sich wirklich Mühe! Auch wenn er nicht richtig erklären kann, was da nun vor sich geht und was nicht 🤡

    Ja, er gibt sich Mühe, aber er redet um den heißen Brei herum. Und wenn ich jede Frage zehnmal wiederholen muß, bevor ich eine verwertbare Antwort bekomme, verliere ich irgendwann auch die Geduld.



  • CStoll schrieb:

    **Was für ein Wert steht vor dieser if()-Abfrage in free[first]?
    **

    Hi CStoll

    es ist ziemlich schwer zu erklären(also für mich), aber ich versuchs nun besser zu machen 😞

    "first" ist ja eine Zahl, zbsp. 3 und free vom typ char(ist ein Vektor) enthält viele ASCII Zeichen.

    A B C D E F G H I J  K  L  M 
    0 1 2 3 4 5 6 7 8 9 10 11  12   ... Elemente
    

    Da ich nun 3 als first habe, bewegt sich der Buchstabe C von da nach last aber nur im Index des Vektors. Wenn last 11 wäre, würd L D sein und es würde so aussehen:

    A B C D E F G H I J  K  C  M 
    0 1 2 3 4 5 6 7 8 9  10 11 12   .. Elemente
    

    So mein ich das 😉

    Aber den genauen Wert vor der IF-Anweisung kann man ja nicht sagen, was der eine Grund wäre,dass der Benutzer erst bestimmen muss von wo es bis nach geht(Durch Eingabe von first und last).

    Mein Vektor, std::vector<char> free(10, ' '); mach ich mal leer, dann tu ich manuell alle Ascii zeichen einfügen:

    unsigned char smiley = 1; // ASCII-Smiley
    unsigned char smiley2 = 2; // anderes Smiley
    // andere möglichen ASCII Zeichen
    
    free[0] = smiley;
    free[1] = smiley2;
    free[2] = smiley;
    free[3] = smiley2;
    free[4] = smiley;
    free[5] = smiley2;
    free[6] = smiley;
    free[7] = smiley2;
    free[8] = smiley;
    free[9] = smiley2;
    

    Dann schaut es so aus:

    A B A B A B A B A B 
    0 1 2 3 4 5 6 7 8 9
    

    A ist Smiley
    B ist Smiley2

    in der If-Anweisung vergleiche ich dann ob free[first] dem entspricht, mit dem man sich als einziges Bewegen kann:

    if(free[first] == A) // ist der Anfangsschritt gleich dem von mir erlaubten?
    {
        //..
    }
    

    Mit freundlichen grüssen
    thomas w.



  • GFGF schrieb:

    Aber den genauen Wert vor der IF-Anweisung kann man ja nicht sagen, was der eine Grund wäre,dass der Benutzer erst bestimmen muss von wo es bis nach geht(Durch Eingabe von first und last).

    Mag sein, daß man den Wert nicht aus der Programmlogik ermitteln kann (soviel sehe ich ja ein), aber du wirst doch wohl nachsehen können, was da drin steht 😉

    (auf deutsch: setz' mal ein cout<<"vor dem if():"<<(int)free[first]<<"/"<<(int)abc<<endl; vor die if-Abfrage und schau nach, ob da zwei identische Werte rauskommen - alternativ könntest du auch lernen, mit dem Debugger umzugehen)



  • achso.. da kommen immer ASCII Zeichen raus. Hier kann man leider keine ausgeben lassen, aber es sind halt verschiedene. Je nach welche Zahl ich eingebe.
    Aber es ist auf jeden Fall korrekt:

    std::cout << "Start(free[first]): " << free[first] << "  First: " << first;
    

    Es wird auch das richtige ausgegeben.



  • dernichtswissende schrieb:

    achso.. da kommen immer ASCII Zeichen raus. Hier kann man leider keine ausgeben lassen, aber es sind halt verschiedene. Je nach welche Zahl ich eingebe.
    Aber es ist auf jeden Fall korrekt:

    std::cout << "Start(free[first]): " << free[first] << "  First: " << first;
    

    Es wird auch das richtige ausgegeben.

    caste die Ausgaben mal in einen int, dann siehst du die ASCII-Codes anstelle der Zeichen (ist mitunter einfacher zu unterscheiden).



  • CStoll schrieb:

    dernichtswissende schrieb:

    achso.. da kommen immer ASCII Zeichen raus. Hier kann man leider keine ausgeben lassen, aber es sind halt verschiedene. Je nach welche Zahl ich eingebe.
    Aber es ist auf jeden Fall korrekt:

    std::cout << "Start(free[first]): " << free[first] << "  First: " << first;
    

    Es wird auch das richtige ausgegeben.

    caste die Ausgaben mal in einen int, dann siehst du die ASCII-Codes anstelle der Zeichen (ist mitunter einfacher zu unterscheiden).

    Hallo CStoll wieder 😉

    also hab mit

    std::cout << static_cast<int>(free[first]) << std::endl;
    

    mal gecastet. Es kommt immer nur der ASCII Code(Integer) vom jeweiligen und dazu noch richtigen ASCII-Zeichen(was der "Benutzer" auch verlangt) als Ergebnis heraus.

    mFG



  • sorry für doppelpost:

    also wenn das Feld gerade ein Smiley ist(zbsp.: ASCII Code "1" = Smiley) und ich dann caste, dann kommt nur 1 raus, was das richtige Ergebnis ist. Nur verstehe ich nicht, wieso das nicht funktioniert(die If-Anweisung) 😞

    mit freundlichen grüssen,
    thomas

    P.S.: ich hab auch vector<char> ... in vector<unsigned char> geschrieben, hat aber leider auch nichts gebracht 😞



  • Was funktioniert denn an der if-Bedingung nun nicht? Wie sind die Eingangswerte und was wird verglichen?



  • Badestrand schrieb:

    Was funktioniert denn an der if-Bedingung nun nicht? Wie sind die Eingangswerte und was wird verglichen?

    Es wird verglichen ob free[first] ein bestimmtest ASCII Zeichen ist.



  • dernichtswissende schrieb:

    also wenn das Feld gerade ein Smiley ist(zbsp.: ASCII Code "1" = Smiley) und ich dann caste, dann kommt nur 1 raus, was das richtige Ergebnis ist. Nur verstehe ich nicht, wieso das nicht funktioniert(die If-Anweisung) 😞

    Und was funktioniert denn nun nicht an der if-Bedingung?
    Die sieht doch glaubich so aus:

    if(free[first] == A)
    

    Was soll daran nicht funktionieren? Du hast dir doch free[first] und first ausgeben lassen... Wo liegt dann das Problem?

    Oder lass es mich anders formulieren: Du willst ja, dass wir dir bei einem Problem helfen (was ja gut ist, dafür ist das Forum ja da). Nur ich verstehe das Problem nicht. Du hast im Prinzip eine Bedingung "if ( x == y )" und du sagst "sie funktioniert nicht". Ich verzweifle langsam 😞


Anmelden zum Antworten