If-Abfrage - Synthaxfehler



  • Hallo,
    bei folgender If-Abfrage

    if(direct==UP) position[1]=(position[1]-amount);
    

    bekomme ich zwei Synthaxfehler:

    error C2143: Syntaxfehler: Es fehlt ';' vor 'if'
    error C2059: Syntaxfehler: '='

    Auch wenn ich geschweifte Klammern benutze oder am Ende noch ein zweites Semmikolon...

    Die ganze Funktion sieht so aus:

    void move(int direct,float amount)
    {
    
    	if(direct==UP) position[1]=(position[1]-amount);
    
    }
    


  • Meine übermüdeten Augen sehen gerade keinen Fehler in den Codeausschnitten. Was steht denn vor der Funktion und wie sind UP und position definiert?



  • Vor der Funktion steht

    #include <iostream>
    #include <stdlib.h>
    #include <windows.h>
    #include <SDL.h>
    #include <glut.h>
    
    #define	UP	= 1;
    #define RIGHT	= 2;
    #define DOWN	= 3;
    #define LEFT	= 4;
    
    using namespace std;
    
    float position[2];
    

    Da sollte kein Fehler drin sein. Kommentiere ich die fehlerhafte if-abfrage aus, funktioniert auch alles.



  • 1.) Es müsste '#define UP 1' heißen.
    2.) Wozu ein define? 'const int UP = 1;'



  • Die #define müssen so aussehen:

    #define    UP  1
    #define RIGHT 2
    #define DOWN 3
    #define LEFT 4
    

    Besser wäre allerdings Konstanten zu verwenden. Die #defines sind nicht so toll, da es dumme Fehler geben kann und etwas vorischt geboten ist. Also besser Konstanten nehmen, z.B. so:

    const int UP = 1;
    const int RIGHT = 2;
    const int DOWN = 3;
    const int LEFT = 4;
    


  • Und nochmals besser wäre enum , dann hat man einen Typ, der nur die angegebenen Werte zulässt.

    enum Direction
    {
        Up,
        Right,
        Down,
        Left,
    };
    

    Die Funktion wird dann zu:

    void move(Direction direct, float amount)
    {
        // hier switch statt if verwenden!
    }
    

    Was im Gegensatz zu int sinnvollerweise einen Fehler verursacht, ist sowas:

    move(7, 3.25f);
    


  • Nexus schrieb:

    Und nochmals besser wäre enum , dann hat man einen Typ, der nur die angegebenen Werte zulässt.

    Was auch ungewollt sein kann, falls man Up|Right will. Da vermisse ich ein flags -Konstrukt.



  • Kombinierbare Flags scheinen hier nicht benötigt zu werden, da die Konstanten Nicht-Zweierpotenzen als Werte haben. Ein enum schadet so oder so nicht, im schlimmsten Fall nutzt man eben die Konvertierbarkeit zu unsigned int . Dann kann man wenigstens in anderen Situationen die Typsicherheit nutzen.

    Und ansonsten böte sich immer noch die Möglichkeit an, den operator| zu überladen.



  • Der erste Syntaxfehler, den ich hier gesehen habe, war "Synthaxfehler". 🕶



  • Das #include <windows.h> ist übrigens ein ziemlich heißer Kandidat für solche Fehler. In den Windows-Includes werden völlig schmerzbefreit riesige Mengen an Makros definiert, die allzu oft sehr allgemeine Namen haben. Evtl. gibt es da z.B. Defines für UP, DOWN etc. Es kann auch sein, dass es sich mit irgendetwas aus den nachfolgend eingebundenen Headern beißt, wobei dann eigentlich noch mehr komische Fehler auftreten sollten.
    Am Besten <windows.h> immer als Letztes einbinden.



  • Tachyon schrieb:

    Das #include <windows.h> ist übrigens ein ziemlich heißer Kandidat für solche Fehler. In den Windows-Includes werden völlig schmerzbefreit riesige Mengen an Makros definiert, die allzu oft sehr allgemeine Namen haben. Evtl. gibt es da z.B. Defines für UP, DOWN etc. Es kann auch sein, dass es sich mit irgendetwas aus den nachfolgend eingebundenen Headern beißt, wobei dann eigentlich noch mehr komische Fehler auftreten sollten.
    Am Besten <windows.h> immer als Letztes einbinden.

    Das ließe sich ja daran erkennen, dass der Compiler wegen Neudefinition warnt. Webster?



  • [quote="_matze"]

    Tachyon schrieb:

    Das ließe sich ja daran erkennen, dass der Compiler wegen Neudefinition warnt. Webster?

    Bei Defines stimmt das, ja. Aber sowas wie min und max, oder enums liefern ziemliche bizarre Fehler.


Anmelden zum Antworten