ich hab ein Arduino Sketch welches für 2 unterschiedlich Ethernet shields compilierbar sein soll also hatte ich: #ifdef W5100 #include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> EthernetUDP Udp; #else #include <EtherCard.h> #include <IPAddress.h> #endif das ist aber GANZ böse, weil (irgendwer) aus irgend einem grund genau VOR die erste Variable (auch wenn diese per ifdef garnicht "existiert") alle funktionen nochmal "deklariert" (ich weiß nicht wie das in C heißt) Grund ist vermutlich dass sich funktionen so gegenseitig aufrufen können sollen?! DANACH wird aber wohl das alles wieder entfernt (dank ifdef) und der code kompiliert nicht .. das ließ sich noch recht einfach lösen (wenn man mal weiß was das Problemist) indem die erste Variable einfach in keinem IFDEF sein darf.. 2. Problem: eine funktion die einen typen verwendet der in EtherCard.h definiert ist: (hier BufferFiller) static void homePage (BufferFiller& buf); wird auch IMMER vor dieser 1. Variable deklariert, auch wenn die ganze funktion dank IFDEF überhaupt nicht existiert.. im preprocessor output sieht man das alles recht gut, nur lösung für 2. problem hab ich noch keine.. wie macht man sowas "korrekt"??
Irgendwie ist dein Geschreibsel arg wirr... Niemand definiert irgend was vor irgendwem von alleine. Variablen kommen da auch nicht vor. Und was genau geht jetzt nicht? Zeig den vollständigen Code, den Aufruf des Compilers, und die Fehlermeldungen des Compilers. Oliver
Woraus ergibt sich denn die Notwendigkeit das "richtig" zu machen? An sich sehe ich in dem beschriebenen Zustand keine Ursache für ein Problem (mit etwas Vorbehalt, da ich Arduino normalerweise nicht mal mit der Kohlenzange anfassen würde).
minnimalcode welcher sich nicht compilieren lässt (zu Problem 2)
1 | im Anhang |
sketch_apr15a.ino:15:23: error: variable or field 'homePage' declared void sketch_apr15a.ino:15:23: error: 'BufferFiller' was not declared in this scope sketch_apr15a.ino:15:37: error: 'buf' was not declared in this scope Error compiling "RICHTIG" machen möchte ich ganz einfache: die funktion "homepage" gibt es nicht wenn W5100 definiert ist..
preprocessor output "homepage" ist dort deklariert obwohl ich es nicht brauche..
Da Du "W5100" definierst (gleich als erste Zeile in Deiner *.ino-Datei), ist es definiert. Auch eine "leere" Definition ist eine Definition.
hier noch der minnimalcode zu beispiel 1
1 | #define semmel
|
2 | |
3 | #ifdef semmel
|
4 | int dummy = 0; |
5 | #endif
|
6 | |
7 | int dummy2 = 0; |
8 | |
9 | void fA(int i) { |
10 | if (i==1) { |
11 | fB(i++); |
12 | }
|
13 | }
|
14 | |
15 | |
16 | void fB(int i) { |
17 | if (i==1) { |
18 | }
|
19 | }
|
20 | |
21 | void setup() { |
22 | // put your setup code here, to run once:
|
23 | fA(1); |
24 | fB(1); |
25 | }
|
26 | |
27 | void loop() { |
28 | // put your main code here, to run repeatedly:
|
29 | |
30 | }
|
enfernt man das #define semmel lässt er sich nicht mehr compilieren.. ifdeftest2.ino: In function 'void fA(int)': ifdeftest2.ino:18:10: error: 'fB' was not declared in this scope Error compiling.
:
Bearbeitet durch User
Mach ein void fB(int i); unter dummy2 und es sollte gehen. Was im übrigen auch das ist was dir der Compiler sagt. Aber das ist vermutlich nicht dein Problem.....
Robert L. schrieb: > die funktion homepage ist im #ifndef ... Hmm. Doch. Hast recht. Benenne das W5100 mal um in irgendwas anderes; möglicherweise steht irgendwo in irgendeiner Headerdatei ein #undef W5100 drin ...
@Narfie
damit funktioniert weiterhin nur eine version
die 2. liefert dann aber einen anderen Fehler..
> undefined reference to `setup'
usw.
:
Bearbeitet durch User
Rufus Τ. Firefly schrieb: > Robert L. schrieb: >> die funktion homepage ist im #ifndef ... > > Hmm. Doch. Hast recht. > > Benenne das W5100 mal um in irgendwas anderes; möglicherweise steht > irgendwo in irgendeiner Headerdatei ein #undef W5100 drin ... auch wenn man alle W5100 durch X5100 ersetzt passiert das selbe.. (einfach den obigen preprozessor output anschauen, dort homepage suchen, dann sollte klar sein was ich meine)
Robert L. schrieb: > ifdeftest2.ino: In function 'void fA(int)': > ifdeftest2.ino:18:10: error: 'fB' was not declared in this scope > Error compiling. Das ist ja auch klar, Dir fehlt da eine sogenannte 'forward declaration'. Zu dem Zeitpunkt kennt der Compiler 'fB' noch nicht.
1 | void fA(int); |
2 | void fB(int); |
Direkt über Deine Funktionsdefinitionen und das sollte laufen!
den code den ich hier gepostet habe, lässt sich problemlos compilieren Beitrag "Re: #ifdef includes und funktionsdeklarationen (arduino)" (einfach mal ausprobieren, arduino ide 1.0.x oder 1.6.x , passiert bei beiden,..) >forward declaration werden automatisch erstellt dass ist ja mein "Problem" (ohne forward declaration würde er sich ja nicht compilieren lassen) erst wenn man das #define semmel weglässt kommen Fehlermeldungen (wer das automatisch macht, weiß ich nicht, gcc g++ precompiler, keine Ahnung.. aber das wäre ja die Frage an die Experten)
lrlr schrieb: > nachtrag: hab es gefunden: > > https://github.com/arduino/Arduino/issues/2406 Genau wegen so einem hirnrissigen Scheiß ist es nicht empfehlenswert als Anfänger mit Arduino anzufangen oder auch als Fortgeschrittener es überhaupt jemals zu benutzen. Da bekommst Du als Anfänger vollkommen falsche (oder gar keine) Vorstellungen wie was zusammenhängt und als jemand der schon lange mit C und C++ uterwegs ist rechnest Du nicht im Traum damit daß jemand ernsthaft auf die Idee gekommen ist sich so einen hirnverbrannten Mist auszudenken, Du rechnest einfach nicht damit weil das sowas von daneben ist daß Du es von vornherein als unwahrscheinlich ausschließt. Deshalb: Wirf die Arduino-Umgebung in die Tonne und mach normales C(++) mit nem normalen Editor oder ner normalen IDE die nicht eigenmächtig und stillschweigend hintenrum am geschriebenen Code herum manipuliert.
Na ja. Ich habe ja Arduino schon vorher abgelehnt und das ist noch ein Grund. Man kann ja die Absicht der Entwickler, wie sie in dem Fehlereintrag beschrieben ist, durchaus nachvollziehen, aber sie hat nur dann einen Sinn, wenn jemand mit Arduino anfängt, der dann um des Spaghettimonsters willen niemals auf die Idee kommt, was mit C zu machen. Das gibt ein Kuddelmuddel sondergleichen. Allen anderen, welche die Absicht haben, irgendwann mal zu programmieren wie es die Profis machen, kann man nur von Arduino abraten. Bei mir kommt das Wort "Arduino" nunmehr in den Filter. Solche Beiträge schaue ich mir gar nicht mehr an. Das war jetzt der letzte Tropfen der das Fass zum überlaufen brachte. Sollen diejenigen, die damit Probleme haben, bitte in den zweifellos vorhandenen und darauf spezialisierten Foren posten.
zum pro/contra arduino sag ich jetzt nicht, das ist ja lächerlich... >Wirf die Arduino-Umgebung in die Tonne und mach normales C(++) >mit nem normalen Editor oder ner normalen IDE die nicht eigenmächtig und >stillschweigend hintenrum am geschriebenen Code herum manipuliert. also ich verwende atmelstudio 6.2. als IDE (für arduino) das C (++) ist leider auch ganz normales C(++) das ist für mich viel die größere katastrophe als solche kleinigkeiten wie das hier .. (aber eine pascal vs. C diskussion wollen wir hier jetzt auch nicht, oder ;-) und wegen der Hardware selber: ich kann es einfach nicht anders, und ob ich mir jetzt irgend eine fertiges "demoboard" hole oder arduino ist doch das selbe...
Robert L. schrieb: > zum pro/contra arduino sag ich jetzt nicht, das ist ja lächerlich... Na ja, du erleidest es ja selber gerade. Die Hardware ist ja ok, die muß man ja nicht mit der Arduino-Software nutzen. Oliver
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.