Ich schlage mich seit gut einer Stunde mit einem Fehler, den ich auch nach dem Lesen einiger Seiten (sowohl hier im Forum als auch außerhalb) nicht klären konnte.
Ein sehr kurzes und sinnfreies Programm, das diesen Fehler provoziert:
Ungefähr das habe ich vermutet. Problematisch ist das wohl besonders in Verbindung mit dem enum: Wenn das 'enum' vor dem Prototypen steht, bekomme ich die Fehlermeldung im Betreff, wenn es andersrum steht, meckert er, weil im Prototypen ein unbekannter Datentyp steht.
Ich habe jetzt die enum-Werte per #define gesetzt und den Datentyp des Funktionsparameters auf bool.
gregorss:
Ich habe jetzt die enum-Werte per #define gesetzt und den Datentyp des Funktionsparameters auf bool.
C enums sind normal int. Daher kann man auch einen Integer als Parameter nehmen
Aber die korrektere Lösung wäre eben die Prototypen per Hand zu machen:
void turn(dir dir_);
Das nachdem das enum definiert wurde, dann ist das auch an der Stelle bekannt. Wenn du das weiterhin über das enum schreibst geht es natürlich immer noch nicht.
Serenifly:
... Aber die korrektere Lösung wäre eben die Prototypen per Hand zu machen:
void turn(dir dir_);
Das nachdem das enum definiert wurde, dann ist das auch an der Stelle bekannt. Wenn du das weiterhin über das enum schreibst geht es natürlich immer noch nicht.
...
Genau das stimmt leider nicht. Siehe oben. Entweder meckert der Compiler, dass 'dir' ein ungültiger Datentyp sei – oder er beschwert sich in der Weise, wie es im Betreff steht.
Bei mir auch.
Die IDE erstellt die Prototypen nur, wenn ich sie nicht selber erstelle.
@gregorss
Unterscheide zwischen der Deklaration und der Definition einer Funktion/Variable.
Der Prototyp, einer Funktion, ist eine Deklaration.
Korrekter: Die Vorwärtsdeklaration einer Funktion
Soeben probiert: Dein Code wird compiliert, mein Code aus dem OP bringt immer noch die gleichen Fehlermeldungen. Liegt es möglicherweise daran, dass Du alles in einer Datei stehen hast? Könntest Du mal testen, ob mein Code aus dem OP bei Dir compiliert?
sketch_feb23b.ino:4:12: error: variable or field 'turn' declared void
sketch_feb23b.ino:4:12: error: 'dir' was not declared in this scope
variable or field 'turn' declared void
Sehr merkwürdig!
Abhilfe / Workaround : Die ersten zwei Zeilen in eine include Datei auslagern.
Ja, das ist sehr komisch Ich sehe nicht was da groß unterschiedlich sein soll.
Der Fehler deutet auf einen Fehler mit dem Parameter hin, so dass der Parser das für eine Variable hält und nicht als Funktion erkennt.
Man kann auch einfach aus dem Parameter einen int machen und bei dem enum bleiben. Wenn man will das sich enums wie richtige Datentypen verhalten dann muss man sowieso C++11 strongly typed enums verwenden.
Im OP nicht, das stimmt, aber mein Beispiel zwei Einträge vorher, hat sogar Serenifly überzeugt
Ist nicht so einfach, die IDE dazu zu bringen, keinen Unsinn zu machen...
Ok. Fehler gefunden! Dass zwei Prototypen erzeugt werden hatte ich mir schon gedacht. Ich hatte den Parser aber für so intelligent gehalten mit Leerzeichen umgehen zu können.
Korrekt:
void turn (dir d);
void turn (dir d)
{
}
Falsch:
void turn(dir d);
void turn (dir d);
{
}
Der Prototyp muss wirklich 1:1 zu übereinstimmen. Wenn bei der Definition ein Leerzeichen ist muss das auch beim Prototyp vorhanden sein. Wenn nicht, darf auch im Prototyp keines stehen.
EDIT: so passt es jetzt glaube ich. Habe das Beispiel so gemacht dass die Funktion ein Leerzeichen hat
Der Prototyp muss wirklich 1:1 zu übereinstimmen. Wenn bei der Definition ein Leerzeichen ist muss das auch beim Prototyp vorhanden sein. Wenn nicht, darf auch im Prototyp keines stehen.
Bei der 1.6.7 ist das offensichtlich nicht mehr so.
Da kompiliert die Variante aus #8 problemlos.
Ich hatte auf Github gelesen dass man den Prototyp Parser überarbeitet hat. Aber ich weiß nicht genau wie. Da stand auch was dass in Zukunft vielleicht Default Parameter gehen würden, wenn auch nicht ganz wie üblich (normal ist der Default Wert im Prototyp).
In den Release Notes steht es auch:
New arduino-builder: faster, better prototype generation ...