Rückgabewert oder Was mache ich falsch?

Gast #2735080
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
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
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
Gast
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.