PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlermeldung: undefined reference to `Prozessflag'



newbie1982
03.08.2008, 21:24
Hallo Leute.
beim Compilieren eines Codes bekomme ich die Fehlermeldung: undefined reference to `Prozessflag'.

Code
#include "BBB.h"
.
.
.
extern uint8_t Prozessflag;
...
if(Tastenabfrage()==1){
_delay_ms(10);
Anreiz=TasteEins;
Prozessflag|= Benutzeroberflaeche;
... }

und bei BBB.h werden die Bits eines 8Bitregisters für einzelne Prozesse reserviert.

//Prozessflags
#define Benutzeroberflaeche (1<<0)
#define Tasten (1<<1)
#define Rechnen (1<<2)

Kann mir jemand vielleicht sagen woran es liegen kann.
Danke im Voraus

fluchtpunkt
03.08.2008, 21:35
Ist doch ziemlich eindeutig.
Dem Compiler fehlt die Deklaration der Variable Prozessflag.

Du weisst was extern bedeutet? Wenn nicht dann gehoert es da wahrscheinlich nicht hin.
-> C-Grundlagen nochmal verinnerlichen

sternst
03.08.2008, 22:09
Dem Compiler fehlt die Deklaration der Variable Prozessflag.

Es fehlt nicht die Deklaration (die steht ja da), sondern die Definition.
Und sie fehlt nicht dem Compiler, sondern dem Linker.
Das nur mal am Rande. ;-)

newbie1982
03.08.2008, 22:39
extern, weil ich Prozessflag in anderen codes benutze (bereits ausserhalb des Blocks vrwendet)
:-) meine nächste Frage wäre, wie definiere ich Prozessflag im Linker
merci

zerush
03.08.2008, 23:02
Mach das extern weg. Das extern bedeutet, dass diese Variable irgendwo anders definiert ist.
Wenn du also von woanders auf diese Variable zugreifen willst, sollte sie dort mit extern deklariert werden. (Das macht man dann meistens in der .h Datei, in der die Variable definiert ist)

sternst
04.08.2008, 07:21
(Das macht man dann meistens in der .h Datei, in der die Variable definiert ist)

Nein, man definiert in einer Haeder-Datei keine Variablen, man deklariert sie dort nur. Definiert wird sie in einer C-Datei.
Warum? Wenn man die Header-Datei in mehrere C-Dateien inkludiert, würde die Variable sonst mehrfach definiert werden. Der GCC-Linker schluckt Mehrfachdefinitionen zwar klaglos, was es aber nicht richtiger macht.

zerush
04.08.2008, 10:12
Ja, darum wird ja auch in der .h-Datei ein extern davor geschrieben!!

Wenn also in main.c die Variable definiert ist, wird sie in main.h mit extern deklariert...

War vielleicht ein Missverständnis.

Gruß,
Thomas

sternst
04.08.2008, 10:49
War vielleicht ein Missverständnis.
Nein, es war schlicht die falsche Wortwahl deinerseits.


(Das macht man dann meistens in der .h Datei, in der die Variable definiert ist)
Und da genau das das Thema hier ist (Deklaration<->Definition), sollte der Satz einfach nicht so stehen bleiben.

zerush
04.08.2008, 11:04
Ja du hast ja recht, eigentlich war das auch so gemeint:


Wenn du also von woanders auf diese Variable zugreifen willst, sollte sie dort mit extern deklariert werden. (Das macht man dann meistens in der .h Datei, in dessen zugehöriger .c Datei die Variable definiert ist)

Um mal zum Thema zurück zu kommen:
Funktioniert es denn jetzt?

newbie1982
04.08.2008, 11:17
einwandfrei ;)
mich verwirren auch diese Deklarationen und Definitionen.
und wie ist es mit Funktionen, werden die dann auch in header Dateien nur deklariert mit Variblen.
Z.B habe ich in einer Ccode einer Funtion
double ADkanalLesen(uint8_t mux){
...
}

definiert
sollte sie auch in der header datei deklariert werden

double ADkanalLesen(uint8_t mux);
???

zerush
04.08.2008, 11:27
genau!

So kannst du dann überhalb innerhalb der .c Datei auf die Funktion zugreifen (die .h Datei muss natürlich included sein). Wenn du diese Funktion auch in anderen Dateien benutzen willst, solltest du hier auch wieder ein extern vor schreiben (auch wenn es meistens auch ohne funktioniert).

sternst
04.08.2008, 11:30
sollte sie auch in der header datei deklariert werden
Wenn sie auch aus anderen C-Dateien aufgerufen werden soll, dann auf jeden Fall.
Wenn sie nur innerhalb dieser einen C-Datei benutzt wird, dann nicht. Dann solltest du sie aber auch static machen.

newbie1982
04.08.2008, 11:30
das habe ich gemacht aber leider kriege ich so eine neue Fehlermeldung
-->declaration for parameter 'ADKanallesen' but no such parameter.
Obwohl ich die wie genannt, die Funktion in der header Datei deklariert habe und die .h Datei in .c Datei angehängt habe.

?

zerush
04.08.2008, 11:34
Kannst du mal den Code beider Dateien posten?

sternst
04.08.2008, 11:35
solltest du hier auch wieder ein extern vor schreiben (auch wenn es meistens auch ohne funktioniert).
Es funktioniert nicht nur meistens sondern immer, denn es ist explizit erlaubt das extern wegzulassen, weil bei Funktionen Deklaration und Definition auch ohne das extern eindeutig zu unterscheiden sind.

newbie1982
04.08.2008, 11:52
und in ADinit.h
steht

double ADkanalLesen(uint8_t mux);
#define u_ref 5.3

sternst
04.08.2008, 12:16
Poste mal die ganze ADint.h. Der Fehler kann auch in den Zeilen davor liegen.

newbie1982
04.08.2008, 13:04
mein Fehler, ich hatte ein Semikolon an einer Funktion vergessen,
und die Funktionen hängen aneinander, deswegen bekamme ich immer die Fehlermeldung.

Ich danke euch für ihre wertvolle Hilfe