Forum: Mikrocontroller und Digitale Elektronik Library in AS einbinden verursacht Fehler


von Veit D. (devil-elec)



Lesenswert?

Hallo,

die Lib funktioniert mit einem Arduino und dessen IDE wunderbar. Ohne 
jede Warnung.

Jetzt programmiere ich in Atmel Studio 7 jedoch einen ATtiny841 direkt.
Dazu habe ich die Lib scheinbar schon erfolgreich einbinden können.
Ich weis aber nicht wirklich aus welchem Ordner er sie sich wirklich 
holt.
Aus dem übergeordneten Workspace Ordner oder darin aus dem Projekt 
Ordner.
Ich hatte viel probiert und war einfach nur erstmal glücklich das er sie 
überhaupt findet und nicht meckert das er sie nicht findet.

Jetzt erhalte ich allerdings einfach beim nackten kompilieren schon 
Fehlermeldungen die seltsam sind für mich.

Weil zum Bsp.

'NULL' was not declared in this scope

Null ist doch C Standard?

Was läuft schief? Was wie muß ich ändern?

Entfernt habe ich die Zeile
#include <Arduino.h>
und habe byte durch uint8_t ersetzt

von mh (Gast)


Lesenswert?

Veit D. schrieb:
> 'NULL' was not declared in this scope
>
> Null ist doch C Standard?

Nö. Nur bei C++.
Ein #include <stdio.h> würde wiederum libio.h mit einbinden, in der NULL 
als Makro angelegt wäre...

Für size_t bräuchtest Du auch einen passenden Header oder Du machst 
einfach einen (unsigned) int oder char draus - je nachdem was Du lieber 
magst...

Weitere brauchbare Fehlermeldungen gehen aus Deinem Screenshot leider 
nicht hervor.


Veit D. schrieb:
> und habe byte durch uint8_t ersetzt

Dafür musst Du aber auch stdint.h inkludieren.

von Hanswurst (Gast)


Lesenswert?

Arduino ist, wenn ich mich nicht irre, C++.

Mit dem AVRStudio kannst Du aber sowohl C als auch C++ schreiben.
Das musst Du erstmal entscheiden. Es hängt auch davon ab, ob die libm, 
die Du da hast, in C++ geschrieben ist oder in C. Hast Du die vielleicht 
von dem Arduino übernommen?

OK. So weit so gut.

Ich weiß nicht eigentlich wo man sinnvoll beginnt, aber als erstes würde 
ich das offensichtliche fixen.
1. Include "stdtypes.h" für uint8_t in C oder <cstdint> für C++
2. Dein Compiler geht irgendwie von C aus, denn NULL ist wie schon 
geschrieben in C++ schon "eingebaut".
3. Die Unklarheit wegen der Herkunft der libm würde ich wenigstens 
verringern, in dem ich nur an einer Stelle, entweder C oder C++ den Pfad 
angebe und dort auch nur einen Pfad.

Dann sieht man mal weiter. Ich vermute, da ist noch einiges zu tun bei 
der Benutzer-Migration. :-)

von Hanswurst (Gast)


Lesenswert?

Wie ich gerade sehe, geht eine andere Fehlermeldung (die dritte von oben 
in dem ersten Bild) von C++ aus. Vermutlich wegen der Extension. 
Irgendwas ist da schief gelaufen.
Vielleicht nochmal ein neues Projekt anlegen.
Vor allem aber für eine C-Variante entscheiden. Nach dem vorhandenen 
Code wäre wohl C++ richtig. Für die Lernkurve aber C.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

okay, Danke erstmal.
Wäre es nicht schlau C++ zu nehmen?
C ist doch in C++ enthalten. Oder nicht?

Und ja Arduino unterstützt C++ 11. Ist in dessen Compilerkonfig 
standardmäßig so eingestellt. Der Compiler ist ja der gleiche wie in 
Atmel Studio. Das nebenbei.

Wenn ich ein neues C++ Projekt erstelle, ist die libm immer da im 
Solution Explorer. Ist nicht von mir eingefügt.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

habe nochmal ein neues C++ Projekt erstellt und

#include <stdio.h>

jeweils in der RS485.. .h geschrieben oder in den Programmcode.
Scheinbar egal wo das eingebunden wird.
Komiliere ich es erscheint erstmal kein Fehler.
Vielen Dank für den Hinweis.  :-)

Achso. Und ich habe den Lib Ordner in dem Toolchain jetzt nur beim C++ 
Compiler als absoluten Pfad angegeben. Vielleicht auch wichtig.
Mal sehen ob das fehlerfrei bleibt.

An welcher Stelle würdet ihr <stdio.h> includieren?

von Hanswurst (Gast)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> habe nochmal ein neues C++ Projekt erstellt und
>
> #include <stdio.h>
>
> jeweils in der RS485.. .h geschrieben oder in den Programmcode.
> Scheinbar egal wo das eingebunden wird.
Bei einem include-File scheint das egal zu sein.
Wenn Du mehrere include-Files hast, die jeweils stdio.h benötigen, ist 
es von Vorteil, stdio.h vor allen anderen Files zu includen, damit Du 
es nicht in jedem der einzelnen Files wiederholt hinschreiben musst.
Da es oft am Anfang nicht völlig klar ist, welche und wieviele weitere 
Include-Dateien zum Projekt hinzukommen ist es günstiger gleich so zu 
beginnen.
Darüber gibt es Kontroversen, aber ich neige zu diesem Weg.

> [...]
> Vielen Dank für den Hinweis.  :-)
Bitteschön.

> Achso. Und ich habe den Lib Ordner in dem Toolchain jetzt nur beim C++
> Compiler als absoluten Pfad angegeben. Vielleicht auch wichtig.
> Mal sehen ob das fehlerfrei bleibt.
Daran darf es nicht liegen. Es gibt bei den meisten Compilern einen 
Standard-Include-Pfad, in denen die C- bzw. C++-Standard-Files liegen.
Dann gibt es, soviele weitere Include-Files wie absolut nötig sind. Bei 
einer Datei also höchstens einen weiteren Pfad.


> An welcher Stelle würdet ihr <stdio.h> includieren?

Äh. Hat mein Text oben in diesem Beitrag die Frage schon beantwortet? 
Falls nicht: Könntest Du bitte die Frage etwas ausführlicher stellen?

von Hanswurst (Gast)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> okay, Danke erstmal.
> Wäre es nicht schlau C++ zu nehmen?
> C ist doch in C++ enthalten. Oder nicht?
Nein. Nicht so wie Du es ausdrückst. Die NULL z.B. ist ein Unterschied. 
Die Include-Files heissen anders. Mal ganz abgesehen von der 
Objektorientierung.
Es gib sicher unter "C C++ Unterschiede" einige Artikel im Netz, die C 
und C++ vergleichen. Vermutlich gibt es auch Artikel die beschreiben, 
was Arduino alles zu C++ hinzufügt, um das Programmieren für Laien 
einfacher zu machen. Das ist eben das, was Du jetzt lernst.

>
> [...]
>
> Wenn ich ein neues C++ Projekt erstelle, ist die libm immer da im
> Solution Explorer. Ist nicht von mir eingefügt.

Nun, die von Dir monierten Fehler beziehen sich ja auch nicht auf die 
libm. Damit sollte das Thema erstmal erledigt sein. Oder kommt doch noch 
was?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ne, jetzt kommt nichts mehr.  :-)  Soweit ist alles klar.
Ich binde die stdio.h jetzt auch gleich am Anfang ein.
Damit ist das zentral, man sieht es immer und kann nichts vergessen.

Danke.

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.