typedef funktioniert nicht ?

Ich habe eine defines.h dort steht unter anderen sowas drin.

typedef enum {STANDBY,ON,OFF} Laserstate;

Die defines.h includiere ich im mainfile.

Dort mache ich dann sowas:

void switchlaser(Laserstate State)
{
  
  
}

Jetzt meckert der Compiler, das er Laserstate nicht kennt. :o
Die defines.h wird definitiv gefunden, weil dort jede Menge anderes drin steht die im mainfile gebraucht werden.

Wenn ich direkt im mainfile definiere, kennt der Compiler den Datentyp Laserstate auch nicht

typedef enum {STANDBY,ON,OFF} Laserstate;

Ist im Prinzip sehr einfach, sehe aber trotzdem nicht wo der Fehler liegt :blush:

typedef brauchst du da nicht

Der Grund weshalb das nicht geht liegt an der automatischen Prototyp Erzeugung der Arduino Software. Die schreibt die Prototypen ganz oben hin und dort ist das enum nicht bekannt.

Zwei Optionen:
1.) Erstellen den Funktionsprototyp per Hand
2.) Übergebe einen int als Parameter. Klassische C enums sind frei in Integer konvertierbar

Eigentlich ist nur Option 1 sinnvoll.

Hat mit typedef oder direkter enum nichts zu tun:

enum Laserstate {OFF, ON};
boolean foo(enum Laserstate s); // Hier wird's gebraucht

boolean foo(enum Laserstate s) {
  return ( s==ON );
}

void loop()  {}
void setup()  {
  pinMode(13,OUTPUT);
  digitalWrite(13, foo(ON) );
}

In obigem Beispiel braucht man keinen Prototype (Vorwärts-Deklaration), da die Definition von foo() gleich nachfolgt.

Falls die Intelligenz der IDE das Problem ist, würde ich das Unerprogramm in eine C++ Datei auslagern, die muß die IDE nicht umwandeln. Die Deklaration (Prototype) dann in die zugehörige Header-Datei legen.

Falls die Intelligenz der IDE das Problem ist

Richtig, das ist das Problem.
Lass die Zeile " // Hier wird's gebraucht" weg, und du hast den Salat: Schlechter als in Standard - C, wo kein Prototyp gebraucht würde.

Die Idee mit der separaten .cpp Datei und der .h Datei ist auch gut, das will rudirabbit doch eigentlich, wenn ich das mit mainfile und defines richtig interpretiere.

Das Projekt ist inzwischen recht umpfangreich geworden, um die Übersicht zu behalten habe ich es in mehrere *.h Files aufgeteilt.
Ohne jeweils ensprechende *.c++ zu haben, ist schlechter Stil ich weiß :blush:

Danke für die Tips, so funktioniert es.
Im Prinzip ist es die Arduino IDE die hier nicht so wirklich C konform ist.

Ich frage mich allerdings ob man dies nicht ändern könnte, meiner laienhafter Meinung kapselt die IDE den arv gcc Compiler.
Habe da einfach zu wenig Ahnung ob dies zu machen wäre.

rudirabbit:
Im Prinzip ist es die Arduino IDE die hier nicht so wirklich C konform ist.

Doch schon. Der Prototyp Parser kommt nur mit einigen Konstrukten nicht richtig zurecht. Dazu gehören auch Templates und Funktionen mit Default Parametern.
Der Fehler in diesem Fall liegt nur an der Position an der die Prototypen geschrieben werden. Das findet vor dem Compilieren statt. Hat also mit avr gcc erst mal nichts zu tun.

In zukünftigen Versionen werden da Verbesserungen kommen. Dazu gab es auf Github Diskussionen und auch neuen Code. Ob genau dieses Problem dazugehört weiß ich aber nicht.

Der Fehler in diesem Fall liegt nur an der Position an der die Prototypen geschrieben werden. Das findet vor dem Compilieren statt. Hat also mit avr gcc erst mal nichts zu tun.

Das meinte ich ja im Prinzip, z.b. das Atmel Studio bringt IHMO auch keinen eigenen Compiler mit.
Dort funktioniert das, bzw ich gehe davon aus.

Dort könnte man nachlesen welche Verbesserungen es gibt.

Du könntest auch evtl. nur eine Minimal.ino mit #includes , setup und loop bauen
und alles andere in .cpp Dateien ( und .h) packen. Die werden von der IDE nicht bearbeitet.
Da musst du natürlich Funktions-Prototypen selbst zur verfügung stellen. ( c - Konform )

Dort [Atmel Studio] funktioniert das, bzw ich gehe davon aus.

Dort machst du es ja auch so, bzw, du schreibst da auch noch die main() Funktion selbst.

Meine Frage des Freds hier ist ja gelöst.

Mir geht es mir eher um das Prinzip was z.b. das Atmel Studio anderes macht als die Arduino IDE.

Dort machst du es ja auch so, bzw, du schreibst da auch noch die main() Funktion selbst.

Klar da gibt es kein setup Gedöns, eine main() und nach dem Init eine mainloop while(1)

Aber das meine ich hier nicht.
Habe einfach zu wenig Ahnung was im Hintergrund abläuft. Wo liegt der Unterschied wenn eine Arduino IDE eine Anwendung Compilert im Vergleich zum Atmel Studio.

Das hat nichts dem Kompilieren zu tun! Das findet vor dem Kompilieren statt.

Was hier relevant ist: Die Arduino IDE erzeugt die Funktions-Protoypen automatisch. Im Atmel Studio musst du die per Hand schreiben.

Auf Prototypen kannst du auch verzichten wenn die die Funktion vor der Verwendung definierst. Vielleicht ist das dir deshalb noch nicht aufgefallen.

Was hier relevant ist: Die Arduino IDE erzeugt die Funktions-Protoypen automatisch. Im Atmel Studio musst du die per Hand schreiben.

Auf Prototypen kannst du auch verzichten wenn die die Funktion vor der Verwendung definierst. Vielleicht ist das dir deshalb noch nicht aufgefallen.

Ahh.. jetzt ist der Groschen gefallen.
Zwar etwas zu Spät, aber besser als nie. Danke