Forum: Compiler & IDEs Rückgabewert oder Was mache ich falsch?


von Timo (Gast)


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

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


Lesenswert?

Timo schrieb:
> In einem externen C-File gibts eine STATIC
> Variable, ich nenne sie mal BUSY.

Ist die Deklaration wirklich in einem .c-File, oder doch zufällig in 
einem .h-File?
Was steht im .c-file, was steht im .h-File?

Timo schrieb:
> extern uin8t_t read_busy (void);

Das extern dort ist nicht nötig.

Oliver

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Timo schrieb:
> Auf diese Busy-Variable möchte ich jetzt in meine Main warten

Das hat nur Sinn, wenn sich diese Variable irgendwie verändern kann. 
Wenn Du in main() darauf warten willst, scheint diese Änderung durch 
einen Interrupt zu erfolgen --> Stichwort volatile.

von Timo (Gast)


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

von Oliver (Gast)


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

von Karl H. (kbuchegg)


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

von DirkB (Gast)


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.

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.