Typedef enum als Funktionsparameter (Arduino)

#3703368
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
#3708786
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.
#3708886
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.
#3709079
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren