-
Wenn Du an irgendeiner Stelle in C eine Funktion aufrufst, muss der Compiler nicht wissen, was in der Funktion an Code steht. Er muss aber den Funktionsrumpf (Name, Parameter, Rückgabewert) für die Codeauflösung kennen. Steht die eigentliche Funktion weiter unten hinter dem Aufruf, erledigt man diese Bekanntmachung üblicherweise über eine Funktionsdeklaration (Vorwärtsreferenz):
void DoSomething(int hellIsFrozen); //The forward reference (function header with ending semicolon)
void main(){DoSomething(42);} //The call
void DoSomething(int hellIsFrozen){while(hellIsFrozen);} //The function
Typischer Halbblödenautomatismus: Um die manuelle Deklaration von Vorwärtsreferenzen zu vermeiden, legt der Arduino-Compiler ungefragt für jede Funktion eine Deklaration unterhalb der #includes an. Dass eine dieser Deklarationen einen Datentyp verwendet, der erst danach im Code deklariert wurde, scheint dabei in Kauf genommen zu werden, ebenso wie die nicht reproduzierbare Fehlermeldung, die naturgemäß nur auf eine vom Compiler erzeugte Codezeile (genau auf die automatisch generierte Vorwärtsreferenzzeile, also quasi für den User nicht nachvollziehbar) verweisen kann.
Ich will das Arduino-Konzept nicht allgemein schlecht reden. Aber DAS ist wirklich dilletantisch gemacht.
-
ja, genau:
es lag nicht an der Funktion, die stand an der richtigen Stelle.
auch die struct war ursprünglich schon an der richtigen Stelle.
Es lag am temp. generierten Arduino-Zwischencode.
Muss man mal bei github als issue melden.
-
update:
die Ursache muss doch woanders gelegen haben, nicht an der gezeigten Reihenfolge sondern evtl bei einer ganz anderen Funktion im Originalcode, die mit diesem error direkt nichts zu tun hatte - lässt sich z.Zt aber nicht lokalisieren.
-
update 2:
es lag doch an einem temporären prototype, das aber erst durch eine weitere - dazwischenliegende - Funktion kritisch wurde, selbst wenn wie in diesem Fall jene zusätzliche Funktion noch nicht einmal genutzt wurde:
https://github.com/arduino/Arduino/i...ment-443704817
Nichtsdestotrotz scheint die neueste IDE 1.9.x diesen Fehler nicht mehr zu erzeugen, wie der Mitentwickler per1234 ja schrieb.