While Schleifen

#4291517
Lesenswert?
• ▲
▼
Peter schrieb:
> Hallo,
>
> Darf man eine While Schleife leer lassen

eine while Schleife kann nicht leer sein.
Innerhalb des Schleifenkörpers steht immer eine Anweisung.

Dise Anweisung kann allerdings auch die leere Anweisung sein, die 
lediglich aus einem ';' und sonst nichts besteht.

Wenn du also zb in
1
  while( irgendwas )
2
    machwas;

die Anweisung 'machwas' durch die leere Anweisung ersetzt, dann steht da
1
  while( irgendwas )
2
    ;

und das ist zuallererst mal fehlerfreies C.
Manche ziehen den ';' in die Zeile mit dem while hinauf. Kann man 
machen, ich finde es ein wenig inkonsequent und ehrlich gesagt auch 
schlechter zu lesen. Die leere Anweisung in ihrer eigenen Zeile zeigt 
wunderbar an, dass in dieser Schleife tatsächlich im Körper nichts 
passiert, sondern die komplette Logik in der Bedingung stattfindet. 
Etwas, das ich auch gerne optisch sehen möchte ohne mich zu fragen, ob 
hier nicht ein gern gemachter Tippfehler begangen wurde.

> um zum Beispiel im Ablauf auf
> eine Bestimmten Eingang oder Variable zu warten? Oder gibt es da bessere
> Möglichkeiten als While?

Ob dieses Polling angebracht ist oder nicht, das kann man so nicht 
sagen. Es ist zuallererst mal eine Möglichkeit. Je nach den konkreten 
Umständen, kann es andere Möglichkeiten geben, die besser sind.
Gast #4291538
Lesenswert?
• ▲
▼
Also müsste es z.B. wenn dann so aussehen:

while (!(PINC & (1<<PINC1)))
{
  ;
}

und nicht

while (!(PINC & (1<<PINC1)))
{
}

?

Noch eine zweite Frage die mich etwas zum Rätseln bringt.

In einem Test Programm habe ich eine globale Variable "unsigned int Test 
= 0;" definiert.
In einer While Schleiche wie oben haben ich die Variable einfach auf 0 
gesetzt, da diese im folgenden im Programm mit dem Wert aus dem ADC 
beschrieben werden soll. Wenn ich das aber tue scheint es als würde das 
Programm an dieser stelle hängen bleiben! Wie ich das bemerke? Durch den 
Timer0 wird eine LED ein und ausgeschalten. Wenn ich in die while 
schleife an delay von 1 MS setze und das 0 setzen der variable blink 
diese auch wenn ich nur die variable 0 setze nicht mehr.
#4291542
Lesenswert?
• ▲
▼
Peter schrieb:
> Also müsste es z.B. wenn dann so aussehen:
>
> while (!(PINC & (1<<PINC1)))
> {
>   ;
> }

müsste muss es nicht.

Eine Block-Klammerung macht nichts anderes, als aus der Abfolge von 
mehreren Anweisungen selbst wieder syntaktisch eine Anweisung zu machen.

Du hast hier eine leere Anweisung in einen Block geschachtelt, der aus 
Sicht des while die Anweisung innerhalb des Schleifenkörpers darstellt 
(der Block, nicht die leere Anweisung)

Man kann es so machen, man muss aber nicht.
Viele machen es so, weil das die Style Guidelines so fordern. 
Syntaktisch ist es aber nicht notwendig. Die Sprache verlangt hier 
keinen Block. Die Sprache verlangt eine Anweisung. Das kann eine 
Block-Anweisung sein, muss es aber nicht.

> und nicht
>
> while (!(PINC & (1<<PINC1)))
> {
> }

Ein Block darf durchaus auch leer sein.


Edit: ja ich weiss, meine Nomenklatur lässt hier ein bischen zu wünschen 
übrig. Aber ich denke, so ist es für den TO einfacher zu verstehen, was 
er hier aus Sicht der C-Sprachregeln in Wirklichkeit tut.
#4291544
Lesenswert?
• ▲
▼
Peter schrieb:

> In einer While Schleiche wie oben haben ich die Variable einfach auf 0
> gesetzt, da diese im folgenden im Programm mit dem Wert aus dem ADC
> beschrieben werden soll. Wenn ich das aber tue scheint es als würde das
> Programm an dieser stelle hängen bleiben!

Dein Programm bleibt sicherlich nicht durch die Zuweisung hängen.

> diese auch wenn ich nur die variable 0 setze nicht mehr.

Dazu müsste man sich jetzt den Rest des Programmes ansehen
Wie immer gilt:
Beschreib nicht deinen Code und was du denkst was passiert (ok, das 
sollte man in vielen Fällen durchaus, den es hilft uns zu erkennen wo 
dein gedankliches Problem liegt), sondern ZEIGE deinen Code.
Gast #4291621
Lesenswert?
• ▲
▼
Ok. Also mit der leeren Schleifen ist es wohl soweit klar. Werde es 
morgen nochmal testen. Aber nochmal zu der ganzen Problematik mit dem 
hängenden Programm. Hab es leider gerade nicht vorliegen aber ich 
versuche es zu erklären. Es ist ein Programm welches Zustände an 
Eingängen abfragt jedoch davor ca. 300ms wartet. Das warten wird durch 
einen Timer realisiert. Das Programm funktioniert so weit auch. Da ich 
mir mit den leeren While schleifen unsicher war habe ich in einer 
schleife ein Delay von 1 MS eingefügt in einer zweiten wird eine 
Variable auf 0 gesetzt. Diese wird praktisch solange immer wieder auf 
Null gesetzt bit der Timer überläuft und das Programm weiter läuft und 
eine LED zum blinken bringt. Leider funktioniert das nicht wenn in 
dieser While Schleife nur diese Variable auf0 gesetzt wird. Wenn ich 
aber ein Delay von 1 MS auch hier einfüge dann geht das ganze auch und 
nach dem Timer überlauf blink auch die LED.
#4291629
Lesenswert?
• ▲
▼
Peter schrieb:
> Ok. Also mit der leeren Schleifen ist es wohl soweit klar. Werde es
> morgen nochmal testen. Aber nochmal zu der ganzen Problematik mit dem
> hängenden Programm. Hab es leider gerade nicht vorliegen aber ich
> versuche es zu erklären.

Schön.
Nur hilft das nichts.

Was du erklärst das ist das, was du denkst das passieren sollte.
Das muss aber nicht das sein, was tatsächlich passiert. Diese Frage kann 
nur ein Blick auf das tatsächliche Programm klären.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.