Forum: Compiler & IDEs Funktion Prototyp von "unsigned char FunktionsName(unsigned char *pByte)"?


von Thomas M. (thomas1123) Benutzerseite


Lesenswert?

Hallo Allerseits,

ich versuche gerade einige Funktionen in externe Dateien auszulagern, 
dabei bin ich auf das Problem gestoßen, dass ich für die folgende 
Funktion keine Ahnung habe wie der Prototyp dafür aussieht.
1
unsigned char FunktionsName(unsigned char *pByte)
2
{
3
   // Mach was
4
5
   return Variable;
6
}

Ich habe schon Folgendes ausprobiert:
1
unsigned char FunktionsName(unsigned char *pByte);
Compiliert nicht mit der Fehlermeldung "multiple definition of 
`FunktionsName'"
1
unsigned char FunktionsName(unsigned char *pByte);
In Konflikt stehende Typen für »FunktionsName«
Compiliert nicht mit der Fehlermeldung "In Konflikt stehende Typen für 
»FunktionsName«"

Als Compiler verwende ich den avr-gcc und als IDE Eclipse auf Ubuntu 
10.04

von Oliver (Gast)


Lesenswert?

Thomas Müller schrieb:
> Ich habe schon Folgendes ausprobiert:
> unsigned char FunktionsName(unsigned char *pByte);

Diese eine Zeile ist richtig. Damit liegt dein Fehler wohl in Zeile 42.

Ich habs jetzt nicht ausprobiert, aber sagt dir gcc nicht sogar, wo die 
andere Defintion von FunktionsName zu finden ist?

Wenn nicht, poste mal das ganze Programm.

Oliver
P.S. Du hast den Funktionsprototyp aber vor die eigentliche Funktion 
geschrieben, oder?

von Thomas M. (thomas1123) Benutzerseite


Lesenswert?

Hallo Oliver,

Zeile 42 muss richtig sein, denn ich habe dank der sommerlichen 
Temperaturen mein Handtuch immer griffbereit :-) Und wie wir ja alle 
wissen kann dann ja  quasi nichts mehr schief gehen.

Ja der Funktionsprototyp ist vor der eigentlichen Funktion definiert.

Soweit ich das heute Nacht noch herausgefunden habe scheint es wirklich 
was mit der doppelten Definition der Funktion zu tun zu haben.

Frage:
Gibt es irgendwo eine Anleitung wie man Code und/oder Funktionen in 
externe Dateien auslagert? Also alles was z.B. mit dem USART zu tun hat 
in eine separate Datei.

Oder Kennt jemand ein kleines Beispielprojekt wo man abgucken kann wie 
das gemacht wurde?

mfg Thomas

von Sven H. (dsb_sven)


Lesenswert?

Der Prototyp für
1
unsigned char FunktionsName(unsigned char *pByte)

Sieht so aus:
1
unsigned char FunktionsName(unsigned char);

Du musst bei den Prototypen einfach den Namen für die Variable weg 
lassen.

von Stefan E. (sternst)


Lesenswert?

Sven H. schrieb:
> Sieht so aus:
1
unsigned char FunktionsName(unsigned char);

Falsch, denn das Argument ist kein "unsigned char", sondern ein Pointer 
darauf.

Sven H. schrieb:
> Du musst bei den Prototypen einfach den Namen für die Variable weg
> lassen.

"musst" ist auch falsch. Er kann, muss aber nicht. Es ist in der Regel 
sogar sehr sinnvoll, die Parameternamen nicht wegzulassen, denn die 
dokumentieren in der Regel ja recht gut die Bedeutung der Parameter.

von Rolf Magnus (Gast)


Lesenswert?

Sven H. schrieb:
> Der Prototyp für
> unsigned char FunktionsName(unsigned char *pByte)
>
> Sieht so aus:
> unsigned char FunktionsName(unsigned char);

Unsinn.

> Du musst bei den Prototypen einfach den Namen für die Variable weg
> lassen.

Das ist nicht notwendig.

Thomas Müller schrieb:
> Ich habe schon Folgendes ausprobiert:
1
unsigned char FunktionsName(unsigned char *pByte);

Das ist korrekt.

> Compiliert nicht mit der Fehlermeldung "multiple definition of
> `FunktionsName'"

Das ist seltsam, denn obiges ist keine Definition, sondern eine 
Deklaration.
1
unsigned char FunktionsName(unsigned char *pByte);
> In Konflikt stehende Typen für »FunktionsName«
> Compiliert nicht mit der Fehlermeldung "In Konflikt stehende Typen für
> »FunktionsName«"

Ähm, das ist doch genau das gleiche.

> Zeile 42 muss richtig sein, denn ich habe dank der sommerlichen
> Temperaturen mein Handtuch immer griffbereit :-) Und wie wir ja alle
> wissen kann dann ja  quasi nichts mehr schief gehen.

Das mit Zeile 42 war eigentlich ein Wink mit dem Zaunpfahl. 
Wahrscheinlich hast du in deinem Quellcode nicht das stehen, was du hier 
schreibst, oder der Fehler liegt wo anders. Da du uns aber den Code 
nicht zeigst, können wir nur raten, wo der Fehler liegt.

PS: Gratulation zum goldenen Schuh ;-)

von Floh (Gast)


Lesenswert?

Wenn du Funktionen auslagern willst, machst du doch verschiedene 
Dateien. Wahrscheinlich sind auch Headerdabei, die möglicherweiße 
mehrfach inkludiert werden?
Es wär mal nicht schlecht, die Dateien, die du bisher angelegt hast, 
herzuzeigen.

von Peter (Gast)


Lesenswert?

hast du den Prototyp in einer header datei? wenn ja kann es sein das sie 
doppelt includiert wird?

von Remote O. (remote1)


Lesenswert?

Ich tippe auch auf doppelt inkludierte header Datei.
Schreib einfach am Anfang der Header Datei:
1
#ifndef TWI_H
2
#define TWI_H
und am Ende:
1
#endif

Das "TWI_H" kannst du natürlich anpassen^^
also in der Art:
1
#ifndef HEADERFILENAME_H_
2
#define HEADERFILENAME_H_
3
...
4
#endif

http://en.wikipedia.org/wiki/Include_guard
http://www.mikrocontroller.net/articles/Funktionen_auslagern_%28C%29

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> hast du den Prototyp in einer header datei? wenn ja kann es sein das sie
> doppelt includiert wird?

Selbst das ist egal.
Von einem Protoypen, genauer gesagt einer Funktionsdeklaration, kann man 
beliebig viele haben, solange sie nur alle übereinstimmen.

Da der Compiler aber von einer Definition spricht (und keiner 
Deklaration) tippe ich einfach mal darauf, dass er den ; am Zeilenende 
im Header File vergessen hat.

von Yalu X. (yalu) (Moderator)


Lesenswert?

"multiple definition of `FunktionsName'" ist keine Fehlermeldung des
Compilers, sondern des Linkers. Die Ursache dafür kann sein, dass die
Funktion "FunktionsName" in zwei verschiedenen Quellcodedateien
definiert wird, oder dass ein Objektmodul versehentlich zweimal in der
Kommandozeile des Linkers auftaucht. Beide möglichen Fehler sollten aber
schnell zu finden sein.

von kleinschreiber (Gast)


Lesenswert?

Probiers mal damit:
1
unsigned char FunktionsName(unsigned char *);

von mano (Gast)


Lesenswert?

Thomas Müller schrieb:
> ich versuche gerade einige Funktionen in externe Dateien auszulagern

was meinst Du jetzt mit "externe Datei"? Ein Modul oder sogar ne Lib?

von Oliver (Gast)


Lesenswert?

Thomas Müller schrieb:
> Gibt es irgendwo eine Anleitung wie man Code und/oder Funktionen in
> externe Dateien auslagert? Also alles was z.B. mit dem USART zu tun hat
> in eine separate Datei.

Es gibt zig Beispiele im Netz, wie andere das gemacht haben.

In Kurzform:

myfile.h:
1
#ifndef MYFILE_H
2
#define MYFILE_H
3
unsigned char FunktionsName(unsigned char *pByte);
4
#endif



myfile.c:
1
#include "myfile.h"
2
unsigned char FunktionsName(unsigned char *pByte)
3
{
4
   // Mach was
5
6
   return Variable;
7
}

main.c:
1
#include "myfile.h"
2
3
int main(void)
4
{
5
   unsigned char *pByte;
6
   FunktionsName(pByte);
7
}

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ergänzung:

Compilieren mit:
1
avr-gcc -mmcu=atmegafoobar -Os -g -c myfile.c
2
avr-gcc -mmcu=atmegafoobar -Os -g -c main.c

Linken mit:
1
avr-gcc -mmcu=atmegafoobar -g -o main.elf main.o myfile.o -lm

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.