mehrere abfragen auf vorhandenen Char in Chararay.



  • Gute Nacht Leute,
    ich hätte da mal eine Frage zu Chararays.
    und zwahr will ich prüfen ob in dem Array der buchstabe X an stelle 1 2 und 3 vorkommt und wen ja soll die if vezweigung ausgeführt werden. hab es so

    if( field[1&&2&&3]==X) oder if (field[1,2,3]==X)
    

    ausprobiert. Doch überprüft er beim ersten nur die erste und beim zweiten nur die letzte Stelle und überprüft diese auf X.

    Ist sicher ein Syntaxfehler und ich muss es anders machen. Aber mich würde trozdem interesieren warum er das so macht.
    ach und zum verständnis und falls es benötigt wird das Spielfeld ist eine Anordnung aus den einzelnen Elementen eines Chararays in die dann jedes Mal X odr O an bestimmter stelle geschriebenwird und die Anordnung wieder ausgegeben wird.

    Ach und ich möchte sehr ungern

    if field[1]==X && field[2]==X...
    

    machen da es sich um eine Funktion zu überprüfung auf sieg aus nem Tic Tac Toe handelt und ich sonst einige if- bedingungen oder nen recht großen switch bräuchte.

    Danke für eure Antworten


  • Mod

    Programmieren ist nicht Raten, das geht besonders in C-artigen Sprachen ganz schnell ganz böse aus. Du musst von jedem einzelnen Zeichen in deinem Programm ganz genau wissen, wo und wieso du es setzt.

    1&&2&&3 ist die Zahl 1 wahrheitswertmäßig mit der Zahl 2 ver-UND-et, und das Ergebnis dann mit der Zahl 3. 1, 2, und 3 sind alle ungleich 0, also true. true UND true UND true ist wieder gleich true. Und der Zahlenwert von true ist wieder 1. Daher ist field[1&&2&&3]==X gleichbedeutend zu field[1]==X. Kannst du sehen, wieso ich im ersten Absatz schrieb, dass man gerade in C++ nicht einfach raten darf?

    1,2,3 ist die Zahl 1 dann die Zahl 2 dann die Zahl 3. Das Komma dazwischen heißt so viel wie "mach das links vom Komma, dann das rechts, und nimm für alles zusammen das rechts an". Die Zahl 1 links "macht" nichts, außer ihren Wert zu haben, ebenso die Zahl 2 und die Zahl 3. Insgesamt ist der Wert von 1,2,3 also 3, und field[1,2,3]==X ist gleichbedeutend zu field[3]==X. Und wieder gut demonstriert, warum raten nicht funktioniert. Da kannst du echt üble Fehler machen, dein Ausdruck hat absoulut gar nichts mit dem zu tun, was du wolltest.

    Zur Frage, wie es richtig geht:

    @käsekuchen sagte in mehrere abfragen auf vorhandenen Char in Chararay.:

    Ach und ich möchte sehr ungern
    if field[1]==X && field[2]==X...
    machen

    Doch, im Prinzip geht das schon so und ist eine gute Methode. Aber: Dann würdest du das gleiche für 4,5,6 und 7,8,9 nochmals schreiben? Da sind doch klare Muster zu erkennen. Ein Traumbeispiel für Dinge, die man programmieren könnte, anstatt mehrmals fast das gleiche zu wiederholen. Dazu sind Computer doch gerade da, damit man sie programmieren kann, solche Aufgaben für dich auszuführen, damit du das nicht schreiben musst. Also ich meine jetzt natürlich nicht, dass du ein Programm schreiben sollst, dass buchstäblich if field[1]==X && field[2]==X... in allen Varianten ausgibt, sondern dass du eine Funktion programmieren solltest, die prüft ob die Positionen N, N+1, und N+2 gleich X sind, für ein gegebenes N. Und ähnlich für die Spalten.

    Mir macht im übrigen Angst, dass du field[1] als die erste Position in deinem Array bezeichnest. Ist es nicht, es ist die zweite. Die erste Position wäre field[0]. Ein weiterer Fall von Raten statt Wissen? Diese Einstellung musst du ganz dringend abststellen!

    PS: Ich sehe, du hast hier schon mehrmals Fragen dieser Art gestellt. Schade, dass du die Erklärungen dort nicht zum Anlass genommen hast, deine Methodik zu ändern. Ich verspreche dir, mit dieser Einstellung wirst du direkt in der nächsten Zeile die du programmierst, wieder scheitern. Und immer so weiter. Lern die Sprache richtig! Oft werden die Fehler viel subtiler sein als eine offensichtliche Fehlfunktion. Beispielsweise die Sache, dass Arrays bei 0 losgehen wäre dir bei einer oberflächlichen Prüfung wahrscheinlich nicht unbedingt aufgefallen, aber wenn dein Programm dann später komplexere Dinge macht, bekommst du dadurch ganz komische unerklärliche Probleme.



  • @käsekuchen sagte in mehrere abfragen auf vorhandenen Char in Chararay.:

    if( field[1&&2&&3]==X) oder if (field[1,2,3]==X)

    Es wird der Ausdruck innerhalb der Klammer ausgwertet:

    bei 1 && 2 && 3 bedeutet das: (1 && 2) && 3 wobei && der logische UND-Operator ist. Alle Zahlen ungleich 0 sind true, 0 ist false. Da steht also (true && true) && true -> das ist true. Und true wird danach wieder als Zahl, nämlich 1, interpretiert.

    Stelle Warnungen an! Clang sagt:

     warning: use of logical '&&' with constant operand [-Wconstant-logical-operand]
     if( field[1&&2&&3]==X) {
                ^ ~
    

    Logisches UND mit Konstanten ergibt wenig Sinn.

    Statt if( field[1&&2&&3]==X) kannst du also schreiben: if( field[1]==X).

    Im zweiten Fall benutzt du den Komma-Operator. Der gibt den Wert des letzten Wertes zurück, also des hinter dem letzten Komma. if (field[1,2,3]==X) entspricht also if (field[3]==X)

    Hier waere die Warnung

    warning: possible misuse of comma operator here [-Wcomma]
     if( field[1,2,3]==X) {
                  ^
    

    Du musst schon einzeln vergleichen:
    if (field[1]==X) && (field[2]==X) && (field[3] == X) { ... }
    Du kannst natürlich auch eine Loop nehmen (bei mehr als 3 wird es ja sonst sehr aufwendig). Beachte auch, dass normalerweise Arrays bei 0 starten, also du eigentlich if (field[0]==X) && (field[1]==X) && (field[2] == X) { ... } vergleichen müsstest.

    Edit: Och menno, da gebe ich mir um diese Zeit noch Mühe mit der Antwort und dann schickt SeppJ seine Antwort ab, während ich das geschrieben habe. Also: nichts wesentliches neues in meiner Antwort.



  • @SeppJ
    danke für die ausführliche Antwort doch das mit

    field[1]
    

    wahr bewust gewählt zu Eifachheit halber der Eingabe.
    das ein Arry bei 0 anfängt wahr mir klar. Ein komplettes Ratespiel betreibe ich hier nicht. Denn dan funktioniert es vieleicht aber ich weiss nicht wieso.
    Das es mit 1 los geht ligt daran dass ich überprüfe welcher spieler an der Reihe ist und dieser dann sein Feld wählt in welches er setzten will indem er eine Zahl eingibt und es wird der jeweilige Buchstabe an die gwünschte stelle im Charary geschrieben und das Feld neu ausgegeben. Ich hätte hier auch von der Eingabe eins abzieghen können.



  • @wob aber trozdem danke für die Antwort


  • Mod

    Lass nicht die Schnittstelle mit dem Menschen deine internen Datenstrukturen beeinflussen! Die internen Datenstrukturen müssen das Problem korrekt im Computer abbilden. Was oft nicht den naiven Vorstellungen des Durchschnittsmenschen entstpricht, aber die Schnittstelle mit dem Menschen vermittelt dann dazwischen.


Anmelden zum Antworten