Forum: Mikrocontroller und Digitale Elektronik Bibliothek erstellen


von ArduStemmi (Gast)


Lesenswert?

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!

von Jim M. (turboj)


Lesenswert?

Dann lies doch mal den K&R in der 2. Ausgabe.

von Peter II (Gast)


Lesenswert?

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?

von W.A. (Gast)


Lesenswert?

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

von ArduStemmi (Gast)


Lesenswert?

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?

von Ray M. (ray_m)


Lesenswert?


von Lehner P. (gruffi)


Lesenswert?

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

von Harry L. (mysth)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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?

von ArduStemmi (Gast)


Lesenswert?

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.

von Lehner P. (gruffi)


Lesenswert?

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
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von grundschüler (Gast)


Lesenswert?

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.

von ArduStemmi (Gast)


Lesenswert?

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!

von Martin B. (martin_b97)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Linkerblinker (Gast)


Lesenswert?

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.

von ArduStemmi (Gast)


Lesenswert?

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

von ArduStemmi (Gast)


Lesenswert?


von Linkerblinker (Gast)


Lesenswert?

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