Funktionen in andere Dateien.

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Funktionen in andere Dateien.

Beitrag von naums » Do Sep 09, 2010 11:34 am

Ich habe eine main.c und will Funktionen auslagern. Soll heißen, dass ich neue Funktionen in eine write.c bzw write.h auslagern will. Einfaches Beispiel: main.c:

Code: Alles auswählen

int main ()
{
    helloworld();
}

helloworld soll folgendes machen: printf("Hello World\n");

Die Funktion helloworld soll nun ausgelagert werden. Wie mache ich das? Kann mir da mal wer Beispiele für die hello.c und die hello.h zeigen? Danke im Voraus (diesmal richtig geschrieben ;) )
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von fat-lobyte » Do Sep 09, 2010 11:50 am

Hallo,
um eine Funktion zu verwenden brauchst du zwei Dinge:

1. Deklaration
Das brauchen alle anderen Funktionen (in diesem Fall main()), um deine Funktion zu kennen, und wissen wie man sie aufruft.

2. Definition
Das ist die "Implementierung" deiner Funktion, also der Tatsächliche Code.


Die Definition kann man in andere Kompilationseinheiten auslagern, das heißt in andere .c files, aber auch in Bibliotheken (.a/.so, .lib/.dll).
Die Deklaration muss in der Kompilationseinheit verfügbar sein, die die Funktion verwendet, das macht man meist mit einem Include.


Eine hello.c ist ein einfaches C-File mit deiner Funktion drinnen

hello.c:

Code: Alles auswählen

#include <stdio.h>

void helloworld()
{
    printf("Hello World!\n");
}
Hier habe ich die <stdio.h> inkludiert, da dieses C-File ja printf() verwendet.

Ein hello.h sieht im einfachsten Fall so aus:

Code: Alles auswählen

void helloworld();
Dies reicht eigentlich schon aus, nur kann es passieren dass es mehrfach inkludiert wird - dann gibt es in manchen Fällen Compilerfehler wegen Mehrfachdeklarationen. Dagegen kann man sogenannte "Include Guards" einbauen, das sieht so aus:

Code: Alles auswählen

#ifndef HELLOWORLD_H_INCLUDED
#define HELLOWORLD_H_INCLUDED

void helloworld();

#endif /* ifndef HELLOWORLD_H_INCLUDED */
Das macht folgendes: das ganze ding wird nur gelesen, wenn das Makro HELLOWORLD_H_INCLUDED nicht definiert ist. Wenn es nicht definiert wird, dann ist das erste was es macht es zu definieren. Dadurch wird sichergestellt, das der Header nur ein einziges mal geparst wird.

Das musst du noch in die main.c inkludieren

Code: Alles auswählen

#include "helloworld.h"

int main() { helloworld(); }
Bemerke: hier habe ich <stdio.h> nicht inkludiert, es wird hier nicht benötigt! Ich rufe ja nur helloworld() auf, und nur das muss ich kennen.

Probier das mal aus, und bei den ersten unverständlichen Linkerfehlern (bitte mit Fehlermeldung reinkopiert) meldest du dich mal. Dann machen wir weiter :-)
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von Xin » Do Sep 09, 2010 1:48 pm

naums hat geschrieben:Die Funktion helloworld soll nun ausgelagert werden. Wie mache ich das? Kann mir da mal wer Beispiele für die hello.c und die hello.h zeigen? Danke im Voraus (diesmal richtig geschrieben ;) )
Eigentlich wollte ich Dir das Make-Tutorial ans Herz legen, weil ich sehr davon ausging, dass es ein entsprechendes Beispielprojekt dabei hatte. Das finde ich aber nicht, bzw. da ist wohl doch keins. Schau es Dir trotzdem an.
Es erklärt nämlich, wie Du mit Make das Beispielprojekt von cppunit kompilieren kannst. Das Projekt schmiert zwar ab (weil es ja getestet werden soll), aber es geht bei Dir ja nicht darum, richtig zu programmieren, sondern richtig zu kompilieren.

Du findest unten einen Link auf ein ZIP-Archiv, in dem es zwei Quellen (main.cpp und stack.cpp) gibt, sowie das Makefile, das beschreibt, wie das dann kompiliert wird.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von naums » Do Sep 09, 2010 6:57 pm

@fat-lobyte: Klappt ^^.
Muss eigentlich die Headerfile und die Codefile den gleichen namen haben (also ausgenommen der Dateikennung) ???

@Xin: Danke für deinen Tipp, den schau ich mir auch noch an. :)

Edit: folgender Fehler is nu da:

Code: Alles auswählen

/tmp/ccmG50Wv.o: In function `main':
main.c:(.text+0x7): undefined reference to `helloworld'
collect2: ld returned 1 exit status
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von Xin » Do Sep 09, 2010 7:40 pm

Welchen Befehl verwendest Du zum kompilieren?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von naums » Fr Sep 10, 2010 2:36 pm

gcc -o test src/main.c
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von Xin » Fr Sep 10, 2010 2:55 pm

Du musst auch den Quellcode angeben, der die Funktion helloworld enthält:

Code: Alles auswählen

gcc -o test src/main.c src/hworld.c
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von naums » Fr Sep 10, 2010 4:45 pm

verstehe... also muss ich immer die CodeFiles mit angeben. Alle CodeFiles, die ich verwenden will? Also wenn ich 500 Files habe, muss ich die alle angeben? Zum Glück benutze ich Skripte zum Compilieren ;)
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von Xin » Fr Sep 10, 2010 5:02 pm

naums hat geschrieben:verstehe... also muss ich immer die CodeFiles mit angeben. Alle CodeFiles, die ich verwenden will? Also wenn ich 500 Files habe, muss ich die alle angeben?
Richtig.
naums hat geschrieben:Zum Glück benutze ich Skripte zum Compilieren ;)
Nicht nur Du.

Wenn Du in einem Verzeichnis alle *.c Dateien kompilieren möchtest, kann Dir ein Make-Skript die Dateien entsprechend kompilieren und anschließend alle entstandenen Objektfiles (hier also die lange Liste) anschließend zu Deinem fertigem Programm zusammensetzen.

Buildsysteme sind schon eine praktische Erfindung. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: Funktionen in andere Dateien.

Beitrag von naums » Fr Sep 10, 2010 5:44 pm

Das muss ich mir auch noch bei gelegenheit anguggen. Aber erstmal muss ich meine BeLL machen. Zumindest mal ganz grob anfangen. Bis Anfang 12/2 will ich das fertig haben. :P
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten