mikrocontroller.net

Forum: Compiler & IDEs frage zur if-anweisung mit while


Autor: ahnungsloser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

folgenden Code habe ich gesehen:

if (pointer == NULL) while(1)

heißt für mich wenn die if-Bedindung erfüllt ist, gehe in eine 
Endlosschleife. Oder sehe ich da was falsch?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahnungsloser schrieb:
> Hallo,
>
> folgenden Code habe ich gesehen:
>
> if (pointer == NULL) while(1)
>
> heißt für mich wenn die if-Bedindung erfüllt ist, gehe in eine
> Endlosschleife. Oder sehe ich da was falsch?

Das kommt drauf an, ob dahinter noch ein ; kommt oder nicht.

Autor: ahnungsloser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Das kommt drauf an, ob dahinter noch ein ; kommt oder nicht.

Ja, da ist ein ;

also so siehts aus

if (pointer == NULL) while(1);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann wird eine Endlosschleife angefangen, sobald die Prüfung der 
Variablen Pointer auf NULL den Wert true ergibt.

Korrekt.

Vielleicht bereitet dir das weniger Kopfzerbrechen, wenn man das etwas 
besser formatiert
  if( pointer == NULL )
  {
    while( 1 )
      ;
  }

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau genommen kann man das aus diesem Codeschnipsel nicht ableiten.

while(1) leitet zwar typischerweise eine Endlosschleife ein; sie kann 
aber durch ein break im Schleifenkörper wieder eine abbrechende Schleife 
werden.

Zeig mal das komplette, von If abhängige Statement bzw. 
Compound-Statement.
Also entweder bis zum folgenden Semikolon oder bis zur nächsten 
äußersten schliessenden geschweiften Klammer.

Autor: ahnungsloser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grrrr schrieb:
> Zeig mal das komplette, von If abhängige Statement

danach gehts dann normal weiter. Die {}klammern von while(1) gibt es 
nicht

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grrrr schrieb:
> while(1) leitet zwar typischerweise eine Endlosschleife ein; sie kann
> aber durch ein break im Schleifenkörper wieder eine abbrechende Schleife
> werden.

Der Schleifenkörper ist aber genau und vollständig dargelegt: er besteht 
aus nichts außer einem abschließenden „;“.  Daraus wird keine 
abbrechende Schleife mehr.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahnungsloser schrieb:
> also so siehts aus
>
> if (pointer == NULL) while(1);
Da wird vermutlich ein Totalabsturz durch den Nullpointer abgefangen, 
indem dem Benutzer ein Totalabsturz durch eine Endlosschleife 
vorgegauckelt wird ;-)

Sinnvoll ist sowas nur auf Multitasking/Multithreading-Betriesystemen, 
bei denen ein andere Task/Thread den hängenden abschiessen kann.

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahnungsloser schrieb:
> Grrrr schrieb:
>> Zeig mal das komplette, von If abhängige Statement
>
> danach gehts dann normal weiter. Die {}klammern von while(1) gibt es
> nicht

Irrtum, weder ; noch { } gehören zum while. (Na ja, bei den { } kann man 
streiten)

while, if, for sind Compound Statements.
d.h. sie bestehen aus dem while, if, for und einer davon abhängigen 
Anweisung. In

   while( 1 )
     ;

bildet der ; die Anweisung, eine leere Anweisung.

Will man mehrere Anweisungen innerhalb des abhängigen Teils haben, so 
muss man diese mehreren Anweisungen in { } einschliessen. Diese Klammern 
fungieren dann als Blockbildner, die syntaktisch aus den mehreren 
Anweisungen wieder eine Anweisung, den Block, machen. Auch bei

  while( 1 )
  {
    tu_was;
    tu_noch_was;
  }

steuert das while nur die Ausführung einer Anweisung. Nur ist diese 1 
Anweisung die Sequenz von Anweisungen, die in einem { } zusammengefasst 
wurde.

Aber syntaktisch sieht while so aus

   while( Expression )
     Statement

ohne ';', ohne { }

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Sinnvoll ist sowas nur auf Multitasking/Multithreading-Betriesystemen,
> bei denen ein andere Task/Thread den hängenden abschiessen kann.

Oder um den Watchdog zu triggern.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder um eine Stelle zu haben, an der man im Debugger einen Breakpoint 
platzieren kann :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. oder weil dem Programmierer für diesen Fall nichts besseres 
eingefallen ist.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.