Forum: Compiler & IDEs Typedef enum als Funktionsparameter (Arduino)


von Andi K. (fry12)


Lesenswert?

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
typedef enum decode_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
void test(const decode_t decodeType) {...}

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

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

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.

von Jürgen S. (jurs)


Lesenswert?

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.

von mark (Gast)


Lesenswert?

Sicher, dass du
1
void test(const decode_t decodeType) {...}
und nicht
1
void test(const decode_e decodeType) {...}
geschrieben hast?

von Andi K. (fry12)


Lesenswert?

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
void test(const enum decode_e decodeType)
probiert, dazu passt obige Fehlermeldung.

Mit
1
void test(decode_t decodeType)
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.

: Bearbeitet durch User
von Jürgen S. (jurs)


Lesenswert?

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
typedef enum { NO_DEC,  HEX_DEC,  BCD_DEC } decode_t;

Und in Deine Sketchdatei inkludierst Du Deine Headerdatei:
1
#include "enums.h"
2
3
void test(decode_t decodeType) 
4
{
5
} 
6
7
void setup() {}
8
9
void loop() {}

Dann funktioniert es auch mit dem selbstdeklarierten Typ als Parameter.
Anders wirst Du es nicht hinbekommen.

von Andi K. (fry12)


Lesenswert?

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!

: Bearbeitet durch User
von bal (Gast)


Lesenswert?

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?

von Jürgen S. (jurs)


Lesenswert?

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.

von Alexander (alecxs)


Lesenswert?

Danke, so funktioniert es. Habe mir den Wolf gesucht.

von Harald K. (kirnbichler)


Lesenswert?

Alexander schrieb:
> Habe mir den Wolf gesucht.

Neun Jahre lang?

von Gunnar F. (gufi36)


Lesenswert?

Harald K. schrieb:
> Neun Jahre lang?

Wenn einer ohne vorherige Suche eine neue Frage stellt, wird er auch 
gerüffelt. Und Alex bedankt sich auch noch höflich. Ist doch nett!

von MaWin O. (mawin_original)


Lesenswert?

Gunnar F. schrieb:
> Ist doch nett!

Nein. Nervt und nutzt niemandem etwas.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.