Rückgabewert oder Was mache ich falsch?

Gast #2735080
Lesenswert?

Moin.
Ich kann einfach meinen Denkfehler nicht finden und weiß auch nicht so 
richtig, wie ich nach dem Problem suchen kann, deswegen ein neuer 
Beitrag.

Also:
Eigentlich ganz einfach. In einem externen C-File gibts eine STATIC 
Variable, ich nenne sie mal BUSY. Die möchte ich abfragen, also gibts 
eine Funktion

uint8_t read_busy (void)
{ return busy; }

und im Header passed ein extern uin8t_t read_busy (void);

Auf diese Busy-Variable möchte ich jetzt in meine Main warten, was ich 
nach meinem derzeitigen C-Kenntnissstand so löse:

while (read_busy());

Geht aber nicht. Ob die Variable nun 0 oder 1 ist, ist meiner 
while-Funktion völlig egal und sie bleibt ewig hängen, so, als würde sie 
die Adresse von der read_busy-Funktion sehen. Im Debugger (AVR STUDIO 6) 
springt der Controller aber immer fleißig zum return busy; also wird das 
Ding ja scheinbar schon aufgerufen.
Ist das ein Optimierungsproblem von dem Compiler? Auch wenn ich es nicht 
in Kurzschreibweise versuche, also while (read_busy() != 0); geht's auch 
nicht. Zusätzlich ist die busy-Variable auch noch als volatile 
deklariert.

Funktionieren tut's bis jetzt nur mit einer extra Variable in der Main, 
die erst zugewiesen (extra = read_busy()) und dann abgefragt wird.

Compilerfehler? Anwenderfehler? Irgendwasjemand eine Idee?

Danke und Gruß,
Timo
#2735094
Lesenswert?

Zeige dein richtiges Programm!

beschreibe nicht deinen Code sondern zeige ihn! Und zwar genau den Code, 
den du auch compilierst!
In C ist jedes einzelne Zeichen wichtig, daher ist es vital, dass wir 
exakt und 100% den Code sehen können, den du auch tatsächlich benutzt.

Du kannst die C und H Files ganz einfach als Attachment anhängen. Das 
ist überhaupt kein Problem.
Gast #2735548
Lesenswert?

Autsch, ich glaub, ich hab's gefunden... Ich hatte in meiner main.c das 
#include von dem Headerfile vergessen, danach ging's dann. Dank dem AVR 
Studio wird ja scheinbar alles irgendwie mit reingelinkt und es gibt 
keine ehrlichen Fehlermeldungen mehr...

Trotzdem danke für die Antworten!

@Oliver:
Mit diesem extern oder nicht extern bin ich mir immer nicht so sicher. 
Gibts da irgendwo mal eine schöne Übersicht, was denn offiziell richtig 
ist. Ich hatte früher alle meine .H-Dateien ohne extern, ging ja auch, 
und dann meinte ich, dass ich mal gelesen hätte, dass das mit extern 
richtiger wäre.

Timo
Gast #2735586
Lesenswert?

Timo schrieb:
> und es gibt
> keine ehrlichen Fehlermeldungen mehr...

Da die Fehlermeldungen acuh im Studio immer noch vom Compiler und vom 
Limker kommen, und die immer pingeliger werden, kann das Studio nichts 
dafür. Wenn der Compiler nichts auszusetzen hat, und er Linker auch 
nicht, das Programm aber nicht das tut, was du von ihm erwartest, dann 
liegt es an deinem Programm.

Der Fehler steckt immer im Sourcecode. Ehrlich ;)

Zum Thema extern:

Externe Variablen (die in einem anderen .c-File deklariert sind) 
benötigen "extern" im Headerfile.

Bei Funktionen braucht es das nicht.

Oliver
#2735670
Lesenswert?

Timo schrieb:

> Mit diesem extern oder nicht extern bin ich mir immer nicht so sicher.
> Gibts da irgendwo mal eine schöne Übersicht, was denn offiziell richtig
> ist. Ich hatte früher alle meine .H-Dateien ohne extern, ging ja auch,
> und dann meinte ich, dass ich mal gelesen hätte, dass das mit extern
> richtiger wäre.

FAQ
Punkt 6: Header File, wie geht das?
sowie Punkt 8: Globale Variablen über mehrere Dateien
Gast #2735751
Lesenswert?

Timo schrieb:
> Autsch, ich glaub, ich hab's gefunden... Ich hatte in meiner main.c das
> #include von dem Headerfile vergessen, danach ging's dann. Dank dem AVR
> Studio wird ja scheinbar alles irgendwie mit reingelinkt und es gibt
> keine ehrlichen Fehlermeldungen mehr...

Aber Warnungen gibt es. Sollte etwas in der Art "Benutzung der Funktion 
read_busy ohne vorherige Deklaration/Definition" sein.

Schalte darum den Warnlevel hoch, beachte die Warnungen und behebe deren 
Ursache.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren