struct Problem

Hallo,

ich wollte mir ein neues struct bauen und scheitere am Compiler. Ich bekomme es für den Compiler nicht deklariert.

struct_Test_001.ino: In function 'void setup()':
struct_Test_001:3: error: 'sEEprom' was not declared in this scope
struct_Test_001:3: error: expected `;' before 'setMES'
struct_Test_001:4: error: 'setMES' was not declared in this scope

void setup()  { 
  
  sEEprom setMES;     // Strukturvariable "setMES"
  setMES.TimerNr = 2;  
  
}   // Ende setup


void loop(void) {

}

struct sEEprom // Deklaration und Strukturtyp Angabe "EEProm"
{
  byte TimerNr;   // Strukturelemente
  byte Interval;
  byte Stunde1;
  byte Minute1;
  byte Stunde2;
  byte Minute2;
};

Wenn ich die struct Definition vor setup verschiebe klappt alles. Jetzt glaube ich zu wissen warum jeder der struct verwendet es in eine .h Datei schreibt und diese einbindet, um es dem Compiler bekannt zu machen.
Wenn ich das ohne .h Datei und nicht vor setup schreibe und versuche es wie sonst bei einer Funktiondeklaration bekannt zu machen, klappt das auch nicht.

So ist es!!!
Erst definieren, dann verwenden.

Bei Funktionen, in der gleichen Datei, ist das nicht so problematisch.

Denn:
Der Compiler ist ein MehrPass Compiler.
Bei den ersten Durchgängen findet er die Funktionsaufrufe und auch die Funktionsdefinitionen.
Die Zuordnung stellt dann ganz zum Schluss der Linker her.

Das ist bei Strukturen anders.
Die müssen vor der Verwendung bekannt sein, sonst steigt der Compiler aus.

Wenn man sich mal mit den Internas von Compilern beschäftigt hat, ist das auch recht offensichtlich warum das nicht anders geht.

Hallo,

Danke für die Bestätigung der Erkenntnis. War mir noch unsicher ob es wirklich nicht anders geht oder ich einen Syntaxfehler oder was anderes falsch habe. Nun muß ich mich entscheiden ob es in eine .h Datei kommt oder vor setup. Mal sehen was mir in dem Fall besser gefällt. :slight_smile:

Wünsche noch einen sonnigen Sonntag ...

Bei Funktionen geht das auch nur automatisch weil die Arduino IDE einen Parser hat und die Prototypen für dich erstellt! Sonst muss man die auch per Hand erstellen damit wenigstens die Signatur vor der Verwendung bekannt ist. Und der Parser kommt nicht mit allen Konstrukten zurecht und macht z.B. bei enum oder Default Parametern Probleme. Ansonsten kommt da so ziemlich der gleiche Fehler.