Guten Abend, ich arbeite mit AtmelStudio 7.0 und programmiere Atmegas. Derzeit einen Atmega 644. Ich programmiere in C. Kann mir jemand sagen, wo ich ein Tutorial finde, welches mir das Erstellen eigener Bibliotheken näher bringt? Mein derzeitiges Programm ist inzwischen sehr unübersichtlich, ich würde gern verschiedene Dinge auslagern. Ich habe aber Probleme bei der Deklaration von Variablen, die ich sowohl im auszulagernden Code als auch in der Main verwende. Danke!
ArduStemmi schrieb: > Ich habe aber Probleme bei der Deklaration von Variablen, die > ich sowohl im auszulagernden Code als auch in der Main verwende. das hat aber nicht mit Bibliotheken zu tun. Hast du noch alles in einer Datei oder hast du mehre C Dateien?
ArduStemmi schrieb: > Ich habe aber Probleme bei der Deklaration von Variablen, die > ich sowohl im auszulagernden Code als auch in der Main verwende. Header-Datei und Inlude sind deine Stichworte
Header Datei hab ich schon, da soll und will ich aber keine Funktionen hin auslagern! Jim M. schrieb: > Dann lies doch mal den K&R in der 2. Ausgabe. Gern. Nur, was ist das?
https://www.mikrocontroller.net/articles/Funktionen_auslagern_(C) http://www.c-howto.de/tutorial-funktionen.html http://www.c-programmieren.com/C-Lernen.html
ArduStemmi schrieb: > Header Datei hab ich schon, da soll und will ich aber keine Funktionen > hin auslagern! In eine header kommt auch keine Funktion, sondern ein Prototyp. Peter II schrieb: > das hat aber nicht mit Bibliotheken zu tun. > > Hast du noch alles in einer Datei oder hast du mehre C Dateien? Wie Peter II schon sagt, musst du eine Biblithek einrichten, sprich du brauchst auch eine .c Datein in der die eigentliche Funktion geschrieben wird. Dann müsstest du mit dem Funktionsaufruf deine Variablen an die Funktion übergeben, sprich:
1 | int funktion_addiere(int a, intb) |
2 | {
|
3 | int c=0; |
4 | c=a+b; |
5 | return c; |
6 | }
|
7 | |
8 | int main(void) |
9 | {
|
10 | int a=3, b=5, c=0; |
11 | |
12 | c=funktion_addiere(a, b); |
13 | |
14 | |
15 | }
|
ArduStemmi schrieb: > Ich habe aber Probleme bei der Deklaration von Variablen, die > ich sowohl im auszulagernden Code als auch in der Main verwende. Du willst also nur eigene "Unterprogramme" schreiben, welche im selben File wie deine main.c Datei ist? Dann würdest du nur "globale" Variablen, anstatt "lokaler" brauchen...
ArduStemmi schrieb: > Jim M. schrieb: >> Dann lies doch mal den K&R in der 2. Ausgabe. > > Gern. Nur, was ist das? https://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
ArduStemmi schrieb: > das Erstellen eigener Bibliotheken Ich rate mal dass du keine Bibliothek willst (also *.a, *.so, *.dll,...) sondern einfach nur dein Projekt in Modulen organisieren willst?
Oder so, ja! Ich will das mit dem
1 | #include
|
machen, das sieht immer so hübsch aus! Macht es Euch doch bitte nicht so schwer. Ich möchte eine C-Datei auf mehrere andere verteilen, am Ende soll immer noch das selbe Programm rauskommen. Bisher war ich der Meinung, das man mit
1 | #include
|
Bibliotheken einbindet, wenn das anders heißt, dann bitte.
ArduStemmi schrieb: > Ich möchte eine C-Datei auf > mehrere andere verteilen, am Ende soll immer noch das selbe Programm > rauskommen. W.A. hätte dir die Antwort schon gegeben ;-) W.A. schrieb: > Header-Datei und Inlude sind deine Stichworte Eine .h reicht aber noch nicht. Du musst, um Funktionen auszulagern, noch eine .c schreiben. Wenn du nun deine Funktionsaufrufe in der "main" machst, musst du wohl auch einige Variablen übergeben... oder Pointer(adressen).
:
Bearbeitet durch User
ArduStemmi schrieb: > Bisher war ich der Meinung, das man mit > #include > Bibliotheken einbindet, wenn das anders heißt, dann bitte. Dieser Meinung sind leider viele, was bei der Diskussion mit Leuten, die wissen, wovon sie reden, unnötige Verwirrung stiftet. Wenn Du in die Autowerkstatt gehst, und im Brustton der Überzeugung erzählst, daß die Kupplung kaputt ist, damit aber das Ding meinst, auf dem "R-1-2-3-4-5" draufsteht ...
Du kanns beliebige Teile des Programmcodes einer C-dATEI - z.B. eine einzelne switch-Anweisung - mit #include "abc.h" auslagern. Das ist nicht die feine Art, aber einfach und unkomliziert. Wenn du es "richtig"/professionel machen willst, musst du eine selbständig kompilierbare *.c-Datei anlegen, weil Funktionen nicht in headerdateien stehen dürfen. Dann bekomjmst du aber Probleme mit Variablen, die in mehreren C-Dateien benötigt werden. Die müssen dann einmal deklariert und im übrigen mit "extern" bekannt gemacht werden. Jede Änderung der Variablen muss dann an mehreren Stellen nachvollzogen werden.
grundschüler schrieb: > Du kanns beliebige Teile des Programmcodes einer C-dATEI - z.B. eine > einzelne switch-Anweisung - mit #include "abc.h" auslagern. Das ist > nicht die feine Art, aber einfach und unkomliziert. > > Wenn du es "richtig"/professionel machen willst, musst du eine > selbständig kompilierbare *.c-Datei anlegen, weil Funktionen nicht in > headerdateien stehen dürfen. Dann bekomjmst du aber Probleme mit > Variablen, die in mehreren C-Dateien benötigt werden. Die müssen dann > einmal deklariert und im übrigen mit "extern" bekannt gemacht werden. > Jede Änderung der Variablen muss dann an mehreren Stellen nachvollzogen > werden. Genau das möchte ich machen! Jetzt meine Frage, weiß jemand, wo ich ein Tutorial oder ein Beschreibung finde, wie man das richtig macht!
Hallo, du erstellt eine .c und eine .h Datei. Die .h Datei bindest du in deinen Quelltext ein. Damit sind die Funktionen in deiner .c Datei dem Compiler bekannt. Dann musst du deine .c Datei kompilieren um eine "Library" zu bekommen, die heißt unter Windows dann .dll und unter Linux .a oder .so. Dann musst du deinem Linker diese Dateinamen mitgeben, damit er die auch in dein Projekt integrieren kann. Wenn nicht gibts halt Linker errors. Grüße, Martin
Martin B. schrieb: > Dann musst du deine .c Datei kompilieren um eine "Library" zu bekommen, > die heißt unter Windows dann .dll und unter Linux .a oder .so. Nein. *.dll bzw. *.so sind dynamische Libraries, die erst zur Laufzeit des Programmes geladen werden. Libraries heißen je nach Compiler/Buildsystem *.a oder *.lib. Um aber ein Projekt aus mehreren C-Quelltext-Dateien zusammenzusetzen, wie vom Threadstarter gewünscht, sind Libraries gar nicht erforderlich. Jede einzelne *.c-Datei wird vom Compiler einzeln übersetzt, das Ergebnis ist eine "Objektdatei" (je nach Compiler/Buildsystem *.o oder *.obj). Um eine fertige Binärdatei/ausführbare Datei zu erhalten, werden alle zum Projekt gehörenden Objektdateien dem Linker vorgeworfen, der sie mit dem Startupcode und gegebenenfalls auch Code aus Libraries anreichert. In Libraries wird bei üblichen Compilern/Buildsystemen der Code von Funktionen, die zum C-Standard gehören (wie printf, fopen, strcpy etc.) untergebracht. Wie der Compiler und wie der Linker aufzurufen sind, und wie die genaue Syntax beim Angeben der jeweils zu verwendenden Libraries ist, ist abhängig vom verwendeten Compiler/Buildsystem -- da lohnt ein Blick ins Handbuch bzw. in die Dokumentation.
Typischer Verlauf eines Threads wo ein Laie/Anfänger grosse Dinge tun will. Er weiss nicht einmal warum man *.h Dateien erzeugt und ihr überschüttet ihn mit hochfachlichen Vorschlägen / Ausdrücken zu speziellen Build-Vorgängen. Ich wette dass der TO nur Bahnhof versteht.
Linkerblinker schrieb: > Typischer Verlauf eines Threads wo ein Laie/Anfänger grosse > Dinge tun will. Er weiss nicht einmal warum man *.h Dateien > erzeugt und ihr überschüttet ihn mit hochfachlichen > Vorschlägen / Ausdrücken zu speziellen Build-Vorgängen. > > Ich wette dass der TO nur Bahnhof versteht. Genau! Ich hatte eine Frage gestellt die mit einem Buchtitel oder einer Internetadresse zu beantworten war. (Wobei ich mir jetzt nicht sicher bin, ob ich nicht mit dem Begriff Internet-Adresse schon wieder alle Ineternet-Profis auf den Plan rufe, die mir erklären, dass es gar keine Adresse im eigentlichen Sinne ist sondern nur der Verweis auf einen Ort, wo der Hinweis versteckt scheint, das eine IP-Nummer existieren könnte, die aber auch nicht immer richtig sein muss.)
ArduStemmi schrieb: > Die Antwort lautet übrigens: Ja vielleicht. Du schaffst es ja nicht einmal die richtige Frage für deine Absichten zu stellen.
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.