Hallo, Darf man eine While Schleife leer lassen um zum Beispiel im Ablauf auf eine Bestimmten Eingang oder Variable zu warten? Oder gibt es da bessere Möglichkeiten als While?
Nennt sich pollen und ist gar nicht unüblich. ich mach sogar gerne einzeiler daraus, finde ich übersichtlich.
1 | while pinIsInactive(); |
Peter schrieb: > Darf man eine While Schleife leer lassen um zum Beispiel im Ablauf auf > eine Bestimmten Eingang oder Variable zu warten? Ja, kann und muss man sogar. > Oder gibt es da bessere Möglichkeiten als While? Passt schon. Gerade bei µCs braucht man so etwas oft.
Frank M. schrieb: > Leo B. schrieb: >>> while pinIsInactive(); >> > Syntax-Error. sorry, es gibt zu viele Programmiersprachen... C war in letzter zeit zu wenig dabei...
1 | while( pinIsInactive() ); |
Besser gibt es allerdings in einigen Fällen schon. Da nutzt man dann Interrupts. Muss aber gar nicht besser sein, aber kann. Kommt drauf an.
na ja, beim µC ist mir ein ordentliches Zeitscheibenmodell mit IRQ und if-Abfragen aber lieber. Muss man später was umstricken, ist es nicht so aufwändig. Viele Grüße!
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.
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.
Meine Wahl wäre:
1 | while (!(PINC & (1<<PINC1))); |
Auf die Blockklammern würde ich großzügiger Weise verzichten.
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.
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.
Peter schrieb: > Darf man eine While Schleife leer lassen um zum Beispiel im Ablauf auf > eine Bestimmten Eingang oder Variable zu warten? Klar geht das:
1 | def wait() |
2 | true |
3 | end |
4 | |
5 | while wait() do |
6 | end |
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.