mikrocontroller.net

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


Autor: Thomas Müller (thomas1123) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
unsigned char FunktionsName(unsigned char *pByte)
{
   // Mach was

   return Variable;
}

Ich habe schon Folgendes ausprobiert:
unsigned char FunktionsName(unsigned char *pByte);
Compiliert nicht mit der Fehlermeldung "multiple definition of 
`FunktionsName'"
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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas Müller (thomas1123) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Prototyp für
unsigned char FunktionsName(unsigned char *pByte)

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

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven H. schrieb:
> Sieht so aus:
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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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.
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 ;-)

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

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

Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich tippe auch auf doppelt inkludierte header Datei.
Schreib einfach am Anfang der Header Datei:
#ifndef TWI_H
#define TWI_H
und am Ende:
#endif

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

http://en.wikipedia.org/wiki/Include_guard
http://www.mikrocontroller.net/articles/Funktionen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kleinschreiber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiers mal damit:
unsigned char FunktionsName(unsigned char *);

Autor: mano (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifndef MYFILE_H
#define MYFILE_H
unsigned char FunktionsName(unsigned char *pByte);
#endif



myfile.c:
#include "myfile.h"
unsigned char FunktionsName(unsigned char *pByte)
{
   // Mach was

   return Variable;
}

main.c:
#include "myfile.h"

int main(void)
{
   unsigned char *pByte;
   FunktionsName(pByte);
}

Oliver

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ergänzung:

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.