Forum: Compiler & IDEs #ifdef includes und funktionsdeklarationen (arduino)


von Robert L. (lrlr)


Lesenswert?

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"??

von Oliver S. (oliverso)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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).

von Robert L. (lrlr)


Angehängte Dateien:

Lesenswert?

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..

von Robert L. (lrlr)


Angehängte Dateien:

Lesenswert?

preprocessor output

"homepage" ist dort deklariert obwohl ich es nicht brauche..

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Da Du "W5100" definierst (gleich als erste Zeile in Deiner *.ino-Datei), 
ist es definiert.

Auch eine "leere" Definition ist eine Definition.

von Robert L. (lrlr)


Lesenswert?

die funktion homepage ist im #ifndef ...

von Robert L. (lrlr)


Lesenswert?

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
von Narfie (Gast)


Lesenswert?

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.....

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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 ...

von Robert L. (lrlr)


Lesenswert?

@Narfie

damit funktioniert weiterhin nur eine version
die 2. liefert dann aber einen anderen Fehler..

> undefined reference to `setup'

usw.

: Bearbeitet durch User
von Robert L. (lrlr)


Lesenswert?

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)

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

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!

von lrlr (Gast)


Lesenswert?

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)

von lrlr (Gast)


Lesenswert?


von Narfie (Gast)


Lesenswert?

Arduino.....

von Bernd K. (prof7bit)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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.

von Robert L. (lrlr)


Lesenswert?

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...

von Oliver S. (oliverso)


Lesenswert?

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
Noch kein Account? Hier anmelden.