Go Down

Topic: Funktion aus Funktion aufrufen die sich in einer Include Datei befindet (Read 285 times) previous topic - next topic

temucin

Hallo,

ich habe aus gründen der übersicht bei meinem Aktuellen Project einige
Funktionen in eine .h Datei gepackt und diese im selben Ordner gespeicher.
Die Arduino IDE 1.6.2 läd diese Automatisch in die IDE. Solange ich keine
Funktions Aufrufe verwende ist alles OK. Auch die Erkennung der Variablen
funktioniert.
Wenn ich aber eine Funktion aus dem Main File oder eine in einer anderen
Include Datei aufrufe , Reklamiert der Linker ... ist nicht in diesem Scope.
Egal wo und in welcher Reihenvolge ich das Include platziere.
Also muss ich in dem Includes die zu verwendenden Funktionen mit Ihren
Parametern bekannt machen. Aber wie? Include scheint mehr zu sein als
einfach nur Funktion um Code nachzuladen.
Meine C Kenntnisse inclusive Fähigkeiten in Englisch sind Marginal. Aber
das ganze jetzt in Klassen und Objekte samt dem dazugehörigen Kram,
will ich mir eigentlich nicht antun.
Jemand da der sich als Lerer berufen fühlt un einem alten Sack ein wenig
auf die Sprünge hilft.

Gruss Temucin

Tommy56

Hast Du das h-File dort includiert, wo Du es aufrufst?

Gib uns doch mal ein Beispiel (mit den zugehörigen Dateien in Codetags) wo es klemmt.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

combie

Genau!
Zeige es.


Alternativ:
Dickes C++ Buch anschaffen!
(was sowieso ein guter Tipp ist! ...denke ich mal...)
"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

michael_x

Quote
Include scheint mehr zu sein als einfach nur Funktion um Code nachzuladen.
Nach meinem Verständnis sollte es eher weniger sein.
( Deklaration von Funktionen, Datentypen, usw. , damit .cpp Dateien schonmal übersetzt werden können, bevor der Linker alles zusammenfügt)

Der Fehler "not declared in this scope" stammt übrigens vom Compiler, nicht vom Linker.


Das mit dem dicken C++ Buch ist zwar ein guter Tip, kommt aber nicht so sehr aufs "Anschaffen",  sondern eher aufs "Einsteigen" an, was zur Not auch ohne Buch geht.

Grundsätzliche Sachen versteht man (ich zumindest) übrigens besser an einem möglichst kleinen Beispiel.

DrDiettrich

Funktionen gehören nicht in Header-Dateien (*.h) sondern in Code-Module (*.cpp), In die Header-Datei kommt nur die Deklaration der Funktion, ohne Code.

combie

Nicht ganz richtig.
Vielleicht meistens, aber nicht zu 100%

Bei dem Paradigma verdirbt es einiges.
z.B. ausgelagerte Inline Funktionen.




"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

gregorss

Funktionen gehören nicht in Header-Dateien (*.h) sondern in Code-Module (*.cpp), In die Header-Datei kommt nur die Deklaration der Funktion, ohne Code.
Das ist für den größten Teil aller Funktionen zwar richtig, aber Combie weist auf wichtige Ausnahmen hin. Kurze Funktionen, die „inline" compiliert werden sollen (die keinen Funktionsaufruf mit allen „Nebenwirkungen" zur Folge haben sollen), sind in Header-Dateien vollkommen in Ordnung (zum Beispiel get-Methoden in Klassen).

Gruß

Gregor
DU MUSST DEIN ÄNDERN LEBEN!

michael_x

Eine Funktion, die inline realisiert werden soll, kann natürlich nicht woanders definiert sein als in der Datei (oder einer dort includierten), wo sie verwendet wird.

Deshalb haben manche Compiler die Voreinstellung, dass Funktionsdefinitionen in .h Dateien inline realisiert werden, aber eigentlich sind das verschiedene Sachen.


Oft ist es auch Faulheit (und damit verständlich aber unentschuldbar), für Funktionsdefinitionen keine eigene .cpp Datei anzulegen.

combie

Betrifft ja nicht nur inline Code.

Auch Konstanten.


In C Stil, würde man sich eine config.h anlegen und da "#define led 13" rein schreiben.
Und wo man die Led braucht, dann eben #include "config.h"

Fast ist die Welt damit in Ordnung, aber leider keine Typeprüfung,  und eine evtl. geworfene Fehlermeldung bezieht sich auf Code, welchen man so nicht im Quelltext vorfindet.(wo kommt diese doofe 13 her?)

Darum wurde const erschaffen.

Ein einfaches "const byte led=13;" macht einen auch nicht glücklich, wenn die *.h Datei mehrfach verwendet werden soll.

Aufteilen in "extern const byte led;"(in der *.h) und const byte led=13; (in der *.cpp), würde uns vor Meldungen schützen, birgt aber das Problem in sich, dass der Compiler dem Linker eine Adresse der Konstanten mitteilen muss.
Damit braucht sie Speicher, und kann nicht weg optimiert werden.

Ein  "static const byte led=13;"  (in der *.h) würde das Problem lösen.

---------

Kann nicht mal einer ein ordentliches Tutorial dazu schreiben?
z.B. "Das Arduino und seine Tabs"
Oder  "Code sinnvoll aufteilen"
 :o  :o  :o  :o


"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

gregorss

...
Deshalb haben manche Compiler die Voreinstellung, dass Funktionsdefinitionen in .h Dateien inline realisiert werden, aber eigentlich sind das verschiedene Sachen.
...
Soweit ich weiß, ist ein Compiler, der Definitionen in Header-Dateien nicht inline compiliert, nicht konform zum Standard.

Wie meinst Du das „eigentlich"?

Gruß

Gregor
DU MUSST DEIN ÄNDERN LEBEN!

gregorss

...
Kann nicht mal einer ein ordentliches Tutorial dazu schreiben?
z.B. "Das Arduino und seine Tabs"
Oder  "Code sinnvoll aufteilen"
...
Das sind zwei Themen, die sich für eine Weekenderei eignen würden. Jetzt habe ich bereits vier weitere Themen. Was fehlt, ist der Schreibanfall :-)

Gruß

Gregor
DU MUSST DEIN ÄNDERN LEBEN!

michael_x

Bei C++ gibt es mehr Standards als Compiler, die ich kenne ;)
In welchem Standard jetzt vorgeschrieben ist, dass Funktionsdefinitionen in .h Dateien inline realisiert werden müssen, und/oder wie man das dem Compiler zur Optimierung selbst überlassen kann, ist mir jetzt zu mühsam nachzulesen.


Quote
Wie meinst Du das „eigentlich"?
- inline als Schlüsselwort kannst du mit und ohne .h Datei verwenden.
- In .h Dateien definierte Funktionen werden wohl bei mehrfacher Verwendung und entsprechender Größe nicht inline realisiert. (Bei Arduino wird sinnvollerweise auf Speicherplatz optimiert)




gregorss

Bei C++ gibt es mehr Standards als Compiler, die ich kenne ;)
In welchem Standard jetzt vorgeschrieben ist, dass Funktionsdefinitionen in .h Dateien inline realisiert werden müssen, und/oder wie man das dem Compiler zur Optimierung selbst überlassen kann, ist mir jetzt zu mühsam nachzulesen.
Ich meine ISO-C++. Frag' mich jetzt aber bitte nicht nach Quellen :-)

[eigentlich ...]
Stimmt. So kapiere ich das.

Gruß

Gregor
DU MUSST DEIN ÄNDERN LEBEN!

temucin

Hallo,

also um es kurz zu machen .... ääääääääääää das soll also heisen das ich C++ lernen muss um
Funktionen auszulagern ?????? Das muss doch einfacher gehen. Der Compiler muss doch nur alle nachzuladenden Teile als Temporär zusammenfügen.

Geuss TFT

DrDiettrich

Oder Du machst es so, wie es schon bei K&R gemacht wurde und heute noch funktionieren muß:

Deklaration (ohne Code) in *.h, Definition (mit Code) in *.cpp.

Go Up