Forum: Compiler & IDEs GCC Frage


von BAB (Gast)


Lesenswert?

und zwar hab ich eine funktion als STATIC definiert...
so nun bringt der compiler folgendes warining:

lcddriver.h:171: warning: `waitbusy' declared `static' but never defined

es funktioniert zwar alles aber trotzdem würde mich interessieren woran 
das liegen könnte

von BAB (Gast)


Lesenswert?

so sieht die funktion definition im header aus

static void waitbusy(void);

von Christian (Gast)


Lesenswert?

Der Compiler weist dich lediglich daruf hin, dass er in deiner 
Headerdatei einen Funktionsprotoypen gefunden hat aber die eigentliche 
Funktion dazu nirgends ausprogrammiert ist.
Solange du die Funktion nirgendwo aufrufst ist das auch kein Problem.

Gruss
Christian

von BAB (Gast)


Lesenswert?

ich rufe die funktion ja innerhalb der datei auf das ist es ja was mich 
so verwirrt...

von Christian (Gast)


Lesenswert?

OK, nochmal

Das da ist ein Funktionsprototyp:
static void waitbusy(void);

Damit gibts du dem Compiler bekannt, dass es irgendwo eine Funktion 
waitbusy gibt, aber die Funktion selber musst du irgendwo anders noch 
ausprogrammieren in der Form

static void waitbusy (void)
{
// Hier kommt der Code der Funktion hin.
}

Übrigens sollte man static Funktionen nicht in der Headerdatei 
deklarieren, da sie für andere Module ja unsichtbar sein sollten.
In deinem Fall würde ich den Prototypen direkt in das C-File einbauen.
Das ganze sieht dann irgendwie so aus.

#include "lcdlib.h"

static waitbusy(void);

// Programmeinstiegspunkt
void main(void)
{

// Hier ist dein Hauptprogramm
for (;;) {   // Endlosschleife
waitbusy();  // Hier wird die Funktion aufgerufen
}
} // ende der Funktion main


// Funktionsbody der Funktion waitbusy
static waitbusy (void)
{
while (noch nicht busy) {
// nur warten
}
} // ende der Funktion waitbusy

von BAB (Gast)


Lesenswert?

ich glaube wir reden aneinander vorbei..:D

die funktion ist deklariert und ausprogrammiert und wird auch 
genutzt...das ist ja das komische...
die funktion funktioniert auch...

von Christian (Gast)


Lesenswert?

Also, ich hab jetzt mal ein kleines Testprogrämmchen gemacht.
Lässt sich einwandfrei und ohne Fehlermeldung übersetzen.

Wenn du magst kannst du mir ja mal deine Quelldatei(en) schicken. 
Irgendwo muss da ja der Hund begraben sein.
Generell lässt sich sagen, dass man Fehlermeldungen nicht ignorieren 
sollte, auch wenn das Programm offensichtlich korrekt erstellt wird.

Gruss
Christian

von BAB (Gast)


Angehängte Dateien:

Lesenswert?

ok...hab den code mal angehängt...der code ist bis auf das wichtigste 
abgespeckt...den rest hab ich rausgekickt...

von Christian (Gast)


Lesenswert?

Du hast den Code etwas zu stark kastriert.
Wo genau wird jetzt deine Funktion waitbusy() aufgerufen? Ist dies 
innerhalb der Funktion delayus() oder aber möchtest du eventuell sogar 
das waitbusy() aus der main Funktion aufrufen, denn das geht nicht, weil 
du die Funktion ja static deklariert hast. Also kann sowohl waitbusy() 
als auch deluyus() nur innerhalb der Datei lcddriver.c aufgerufen 
werden.
Ich vermute, du möchstest die Funktionen in deinem Hauptprogramm 
verwenden. In diesem Fall darfst du dir Funktionen nicht(!) als static 
deklarieren, sondern ganz normal

void waitbusy(void);
void delyaus(unsigned us);

Gruss
Christian

von BAB (Gast)


Lesenswert?

also waitbusy und delayus werden nur innerhalb der lcddriver.c 
aufgerufen und nicht in anderen files like der Main methode...aber wenn 
du das kompiliertst wie es ist, wirst du sehen das der fehler auch 
weiterhin bestehen bleibt da
waitbusy() und delayus() NUR in der lcddriver.c aufgerufen 
werden..:D...und deshalb habe ich die auch als static 
definiert...compiliert das mal und siehst was ich meine..:D

gruss,
kai

von Christian (Gast)


Lesenswert?

Ich denke, ich hab's

Beim Compilieren der Datei lcdtest.c findet der Compiler wegen dem 
Include von lcddriver.h die static-Funktionen. Nun erwartet der Compiler 
aber auch, dass diese Funktionen im aktuellen Scope, also innerhalb 
lcdtest.c programmiert sind, da sie ja als static deklariert wurden. Da 
er diese nicht findet (weil sie in lcddriver.c codiert sind) gibt er die 
Warnungen aus.

Lösung:
Entweder den Include-Befehl in lcdtest.c weglassen oder die 
Funktionsprototypen in lcddriver.c einbauen und in lcddriver.h löschen.

Gruss
Christian

von BAB (Gast)


Lesenswert?

besten dank für deine mühen Christian...:D

gruss,
kai

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.