If-Abfrage - Synthaxfehler
-
Hallo,
bei folgender If-Abfrageif(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 einflags
-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 zuunsigned 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.