funktionen aus externer c datei implementieren



  • hi,

    ich suche jetzt schon eine ganze weile nach einer problemlösung....ka warum ich nichts finde so ungewöhnlich ist das problem doch eigentlich nicht :?

    ich würde gerne eine c datei mit befehlen zum ansteuern eines lcd displays einbinden, nur wie geht das konkret?

    ein einfaches speichern der c datei
    und ein implementieren dieser per include geht nicht

    unter assembler ist das verdammt einfach aber wie geht es mit c?

    gruß



  • Lieber einzeln übersetzen, als Code-Chaos zu provozieren. Die üblichen Compiler machen object files aus den Quelltexten, die dann nachher zusammengelinkt werden. Wie man das in Auftrag gibt, hängt von deinem Compiler ab.



  • Hi,
    einbinden per include geht, aber du darfst nicht die Funktionskörper (Definitionen) einbinden, sondern die Prototypen.
    Um also Funktionen benutzen zu können ( ich nehme an, du meinst mit Befehlen Funktionen ), musst du die Funktionsprototypen deinem Compiler bekannt machen:
    Die Prototypen können ( meistens eingebettet in include guards um Mehrfacheinbindung zu verhindern ) in einer oder mehreren separaten Dateien sein. Die Dateiendung ist Wurscht, üblicherweise spendiert man die Dateieindung *.h, man erhält die sogenannten Headerdateien. Diese werden mit der #include Anweisung in den C Dateien eingebunden, in denen sie gebraucht werden.

    Die andere Möglichkeit ist, die Funktionen als extern zu deklarieren.
    Man schreibt also z.B.

    extern my_func();
    

    an den Anfang der C Datei, in der diese Funktion gebraucht wird.

    Wenn du eine IDE benutzt, fügst du deine C Datei zu deinem Projekt dazu und suchst dir eine der oben genannten Möglichkeiten aus, dann sollte das funzen.

    Gruß,
    B.B.



  • ok

    was genau muss ich in diesem zusammenhang unter prototypen verstehen?



  • -xc- schrieb:

    was genau muss ich in diesem zusammenhang unter prototypen verstehen?

    Sieht aus wie eine Funktionsdefinition, nur ohne die {}. Macht man, wenn eine Funktion aufgerufen werden soll, die erst später oder woanders definiert wird; damit der Compiler die Einzelheiten kennt, der verlässt sich dann nämlich darauf, dass der Prototyp stimmt.

    Big Brother schrieb:

    Die andere Möglichkeit ist, die Funktionen als extern zu deklarieren.
    Man schreibt also z.B.

    extern my_func();
    

    an den Anfang der C Datei, in der diese Funktion gebraucht wird.

    Das klingt verwirrend. Prototypen sind sowieso extern, das kann man nun auch noch dazusagen oder nicht, das ist ganz gleichgültig.

    Auch klingt es verwirrend, dass das eine andere Möglichkeit sein soll, als ein #include zu verwenden. Wenn der Präprozessor ein #include "xyz" sieht, tut er nichts anderes, als diese Zeile durch den Inhalt von xyz zu ersetzen. Ist irgendwie doch die gleiche Möglichkeit: wenn man's aufrufen will, muss man es vorher definieren, oder vorher einen Prototyp hinschreiben.



  • Ein Prototyp ist sowas wie

    void returnscreensize(DISPLAY *);
    

    Da steht dass diese Funktion existiert, aber nicht wie genau sie funktioniert. Damit kannst du zum Beispiel Bibliotheken benutzen ohne dich um deren Inhalt kümmern zu müssen. Üblicherweise stehen Prototypen oder auch Deklarationen in .h-Dateien und die eigentlichen Funktionen sind in den .c-Dateien, oder auch in .dll oder libs.

    Du willst also

    #inlude "headername.h"
    

    in deinem C-Code benutzen um an die Funktionen in der .c-Datei zu kommen.

    Du solltest dir vielleicht einige .h-Dateien ansehen, meist stehen dort Kommentare und alle Prototypen von Funktionen die du nutzen kannst. Die .c-Datei hat Implementationsdetails die keinen interessieren brauchen.



  • ok, ich werde mich damit genauer auseinandersetzen



  • µngbd schrieb:

    Das klingt verwirrend. Prototypen sind sowieso extern, das kann man nun auch noch dazusagen oder nicht, das ist ganz gleichgültig.

    Das Schlüsselwort extern soll andeuten, das die Funktion in einer anderen Datei ist.
    Ich hatte es mal ne zeitlang so gemacht:

    // main.c
    extern int prototyp_der_externen_art();
    int prototyp_der_lokalen_art();
    

    Extern hatte ich davor geschrieben, wenn sich die Funktionen in einer
    anderen Datei befanden. Die Prototypen ohne das Schlüsselwort extern
    waren Funktionen, die nur innerhalb der Datei gebraucht und nicht
    exprotiert waren. Kommt ja mal vor, das man ne Funktion ändern muss :D, da wusste ich sofort: kein extern davor - Ahaaaaa! Suchst du Funktion in der selben Datei. Extern davor - Ahaaaa! Machst du gucki in anderer Datei.
    Nunja, inzwischen benutze ich die andere Möglichkeit: nur noch Headerdateien. Da schreibe ich aber nicht extra auch noch extern vor die Prototypen.

    µngbd schrieb:

    Auch klingt es verwirrend, dass das eine andere Möglichkeit sein soll, als ein #include zu verwenden. Wenn der Präprozessor ein #include "xyz" sieht, tut er nichts anderes, als diese Zeile durch den Inhalt von xyz zu ersetzen. Ist irgendwie doch die gleiche Möglichkeit: wenn man's aufrufen will, muss man es vorher definieren, oder vorher einen Prototyp hinschreiben.

    Für dich mag es verwirrend klingen, für mich sind es zwei Möglichkeiten, auch wenn das Ergebnis gleich ist.
    <ironie>
    Wenn die Sonne scheint und ich in der Stadt nen Bummel machen will,
    kann ich bequem den Bürgersteig lang gehen, oder den Gullideckel hochklappen
    und durch die Kanalisation robben.
    Ist doch irgendwie die gleiche Möglichkeit: Ich komme in der Stadt an.
    </ironie>

    Gruß,
    B.B.



  • B. B. King schrieb:

    Wenn die Sonne scheint und ich in der Stadt nen Bummel machen will,
    kann ich bequem den Bürgersteig lang gehen, oder den Gullideckel hochklappen
    und durch die Kanalisation robben.
    Ist doch irgendwie die gleiche Möglichkeit: Ich komme in der Stadt an.

    🙂
    Ich sehe die Wahrheit in deinen Worten. Mit der Zeit legt man sich eine Strategie zu, mit Prototypen umzugehen, dann hat man weniger Sorgen damit. Geht mir auch so. Nur früher, wenn ich ein #include-Chaos produziert habe und nicht mehr durchgestiegen bin, hab ich mir immer vorgesagt, dass es nur um simplen Textersatz geht: so hab ich's immer in den Griff bekommen.

    Ihr kennt sicher auch die grässlichen Fehler, die man erzeugen kann, wenn man falsche Prototypen angibt. Habt ihr eigentlich eine vernünftige Strategie, mit solchen unabsichtlichen Lügen umzugehen? Ich nämlich nicht: das dauert dann immer eine Weile, bis ich's gefunden hab.


Anmelden zum Antworten