Hallo zusammen!
Ich experimentiere gerade ein bisschen mit einem Arduino Leonardo und
bin nun über ein Problem gestolpert bei dem ich nicht weiterkomme, das
aber wahrscheinlich schnell gelöst sein dürfte.
Ich definiere global eine enumeration mit typedef:
1
typedefenumdecode_e
2
{NO_DEC,
3
HEX_DEC,
4
BCD_DEC
5
}decode_t;
Nun möchte ich das Ganze als Parameter an eine Funktion übergeben:
1
voidtest(constdecode_tdecodeType){...}
Allerdings spukt mir die IDE (ich nutze Atmel Studio 6.2 mit dem Visual
Micro Addon) folgende Fehlermeldung aus:
"error: use of enum 'decode_e' without previous declaration"
Die angegebene Zeilennummer stimmt aber leider überhaupt nicht, dort
stehen nur #define Anweisungen für ein paar Konstanten.
Weiß jemand wo der Fehler liegt? Vielen Dank schon mal! (:
Grüße
Andi X. schrieb:> Weiß jemand wo der Fehler liegt?
Also ich weiß, wo er nicht liegt, nämlich in den paar Zeilen, die du
gepostet hast.
Übrigens: War Arduino nicht C++? Da bringt dir der Typedef doch gar
nichts.
Andi X. schrieb:> Weiß jemand wo der Fehler liegt?
Eigene Typen, die Du dann als Funktionsparameter in Deinen Funktionen
verwendest, kannst Du nur in Libraries (Headerdatei) deklarieren, die Du
dann einbinden müßtest.
Deine Enumeration kannst Du aber auch als "byte" oder "integer"
Funktionsparameter in der Funktion verwenden.
Jürgen S. schrieb:> Deine Enumeration kannst Du aber auch als "byte" oder "integer"> Funktionsparameter in der Funktion verwenden.
Jo, das ist klar, mir geht es hier eigentlich nur um die bessere
Lesbarkeit des Sourcecodes.
@mark: Habs gerade nochmal kontrolliert, es passt alles soweit.
Das kann doch nicht sein, normal müsste es doch so klappen, oder täusche
ich mich?
Edit: Ah okay, ich sehe gerade, dass ich die falsche Fehlermeldung
reinkopiert habe. Ich hatte es nämlich schon mit
1
voidtest(constenumdecode_edecodeType)
probiert, dazu passt obige Fehlermeldung.
Mit
1
voidtest(decode_tdecodeType)
als Funktionsparameter, erhalte ich folgende Meldung:
error: expected ',' or '...' before 'decode'
error: ISO C++ forbids declaration of 'decode_t' with no type
Die Zeilenangabe ist wieder eine #define-Anweisung einer Konstanten,
völlig ohne Bezug zu der Funktion oder der Enumeration.
Andi K. schrieb:> Das kann doch nicht sein, normal müsste es doch so klappen, oder täusche> ich mich?
Neihein, auch fünf Tage später nicht.
Durch die "Magic Tricks" der Arduino-IDE funktioniert es nur, wenn Du
Deine enum-Deklarationen in einer eigenen Headerdatei machst und diese
per #include in Deinen Sketch einbindest.
Hast Du in der Arduino-IDE schon mal die Möglichkeit genutzt, mehrere
"Tabs" zu nutzen, um Deinen Sketch in verschiedenen Dateien zu
strukturieren?
Ein neues Tab-Fenster öffnest Du durch einen Klick auf das kleine nach
unten weisende Dreieck mit der Funktion "Neuer Tab". Als Dateinamen für
TAB-Fenster kannst Du .cpp, .c oder .h Dateien angeben, in diesem Fall
wählst Du eine Headerdatei, z.B. Dateiname "enums.h" für den Tab.
In diese "enums.h" Datei trägst Du Deine enum-Deklaration ein, z.B.
1
typedefenum{NO_DEC,HEX_DEC,BCD_DEC}decode_t;
Und in Deine Sketchdatei inkludierst Du Deine Headerdatei:
1
#include"enums.h"
2
3
voidtest(decode_tdecodeType)
4
{
5
}
6
7
voidsetup(){}
8
9
voidloop(){}
Dann funktioniert es auch mit dem selbstdeklarierten Typ als Parameter.
Anders wirst Du es nicht hinbekommen.
Sorry mein Fehler, ich habe das "nur" in deinem ersten Post voll
überlesen ;)
Wieder bewahrheitet sich der Spruch: Wer lesen kann, ist klar im
Vorteil!
Danke!
bal schrieb:> Nur aus Interesse:> was macht denn die Arduino IDE für Tricks, dass typedefs nur in Header,> nicht aber in den Sourcen funktionieren?> Was passiert da?
Siehe http://arduino.cc/en/Hacking/BuildProcess unter "Transformations
to the main sketch file"
Zitat:
the environment searches for function definitions within your main
sketch file and creates declarations (prototypes) for them. These are
inserted after any comments or pre-processor statements (#includes or
#defines), but before any other statements (including type
declarations). This means that if you want to use a custom type as a
function argument, you should declare it within a separate header file.
Arduino-Programmierer schreiben keine Funktionsprototypen oder
Vorwärtsdeklarationen, das macht die "Arduino-Software" automatisch. Und
fügt diese am Anfang des (für den Arduino-Programmierer unsichtbaren)
Codes ein, der tatsächlich kompiliert wird. So steht dann im Endeffekt
ein Funktionsprototyp mit dem typedef-Parameter im Quellcode BEVOR die
eigentliche typedef Definition erfolgt. Auch, wenn der
Arduino-Programmierer das nicht sieht. Und das kompiliert nicht.