Forum: Compiler & IDEs AVR Projekt: Zugriff auf Funktionen eines anderen c-files


von Furo (Gast)


Lesenswert?

Hallo!

Ich steh grad etwas auf dem Schlauch. Ich habe ein Projekt im AVR Studio 
angelegt. Unter Source-File habe ich zwei c-Files mit unterschiedlichen 
Funktionen (nur eine hat die main-funktion). Wie greife ich nun aber von 
einer Funktion aus dem einem c-File auf eine Funktion des andere c-Files 
zu?

Danke für eure Hilfe.

Gruß
Furo

von Patrick (Gast)


Lesenswert?

Mache ein header-file für das eine c-file und "include" es dann im 
anderen. In diesem header-file schreibst Du dann den Prototypen zu 
Deiner Funktion, die Du im anderen File verwenden willst.

von Ulrich (Gast)


Lesenswert?

so:
1
funktionsname(parameter)

;-)

Du musst allerdings noch eine Headerdatei anlegen:
zweiteDatei.h

und dort von der Funktion den Prototypen reinschreiben:

z.B. int funktionsname(int paramter1);

von Patrick (Gast)


Lesenswert?

Konkret:

Im ersten c-File:
test.c
1
void Funktion1 (void)
2
{
3
 //Code
4
}

Dann dazu test.h:
1
extern void Funktion1 (void);

Dann kannst Du im main.c:
1
#include "test.h"
2
3
int main (void)
4
{
5
Funktion1();
6
7
while(1){..}
8
return 0;
9
}

von G. L. (sprintersb)


Lesenswert?

Wie gesagt schreibt man ein Header-File, zB foo.h
1
#ifndef _FOO_H_
2
#define _FOO_H_ /* vermeidet Probleme bei Mehrfach-Includes */
3
4
#define WERT_1 0x1
5
6
typedef struct
7
{
8
   ...
9
} data_t;
10
11
extern void foo (void);
12
13
extern int zahl;
14
15
#endif /* _FOO_H_ */

und in foo.c
1
#include "foo.h"
2
3
int zahl = 12;
4
5
void foo (void)
6
{
7
   zahl = WERT_1;
8
}

und in bar.c
1
#include "foo.h"
2
3
int main()
4
{
5
   foo();
6
7
   if (zahl != WERT_1)
8
      ...
9
}

Die einzelnen Module können separat compiliert wergen mit gcc und später 
gelinkt
1
xxx-gcc <optionen> -c foo.c -o foo.o 
2
xxx-gcc <optionen> -c bar.c -o bar.o 
3
xxx-gcc <optionen> foo.o bar.o -o foobar.elf

Alternativ kann auch alles zusammen übersetzt werden
1
xxx-gcc <optionen> foo.c bar.c -o foobar.elf

von Furo (Gast)


Lesenswert?

Oh, irgendwie ist das bei mir wohl zu arg verschachtelt.
Da die Funktion der c-Klasse die aufgerufen werden will wieder von 
Methoden abhängt, die in Header-Files definiert sind, die wiederum in 
der "Main-Klasse" eingebunden werden.
Binde ich nun die Header-Files in dem zweiten c-File ein, kommen auch 
viele Meldungen der doppelten Defintion...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Da die Funktion der c-Klasse die aufgerufen werden will wieder von
> Methoden abhängt, die in Header-Files definiert sind, die wiederum in
> der "Main-Klasse" eingebunden werden.

Du programmierst in C. Das kennt keine Klassen und keine Methoden.


> Binde ich nun die Header-Files in dem zweiten c-File ein, kommen
> auch viele Meldungen der doppelten Defintion...

In Headerdateien gehören Deklarationen, keine Definitionen.

Also keine Funktionen, sondern nur deren Prototypen.

von Furo (Gast)


Lesenswert?

Aha .... sonderlich schlauer bin ich jetzt jedoch nicht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Binde ich nun die Header-Files in dem zweiten c-File ein, kommen
> auch viele Meldungen der doppelten Defintion...

(...)

> Aha .... sonderlich schlauer bin ich jetzt jedoch nicht.

Dann sieh Dir doch mal so eine Fehlermeldung genauer an und sieh Dir an, 
was Du wo deklariert hast und was Du wo eingebunden hast.

Verwendest Du globale Variablen? Hast Du die in der Headerdatei korrekt 
als extern deklariert?

Wie sehen Deine Funktionsprototypen aus?

Bindest Du etwa auch *.c-Dateien per #include ein?

von Stefan E. (sternst)


Lesenswert?

> Aha .... sonderlich schlauer bin ich jetzt jedoch nicht.

Poste doch einfach mal deinen kompletten Code.

von Pete K. (pete77)


Lesenswert?

Oder mal ein gutes C-Buch lesen...

von Marco G. (stan)


Lesenswert?


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.