PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 'While' functioniert nicht?



Arexx-Henk
24.02.2005, 17:29
Hallo Programmierer,

Die 'while' Schleife functioniert nur EINMAL (= Falsch) und die 'for' Schleife functioniert IMMER. (= Richtig)

Mein Program:


unsigned char Flag;
int main(void){
--------geht-nur-einmal------
Flag=1;
while(Flag) {
start_some_timer(); //generates overflow interrupt after some time
Flag=0;
}
--------geht-nur-einmal------ende
}
my_timer_overflow_interrupt_handler{
Flag=1;
}

--------------alternative-----------
Flag=1;
for(;;){
if(Flag){
start_some_timer(); //generates overflow interrupt after some time
Flag=0;
}
}
--------------alternative-----------ende


Was ist den hier die Unterschied zwischen 'while' und 'for'?

Gruss

Henk

Arexx-Henk
24.02.2005, 18:04
Hallo Programmierer,

noch was dazu.
Ich hab noch mal im produzierten listfile geguckt.

----------------------
while(1);

wird erzetzt vom:

.L5
rjmp .L5

Spring zuruck, scheint mir OK
----------------------
while(Flag){
mag etwas
}

wird erzetzt vom:

mag etwas

es wird gar nicht mehr zuruck gesprungen!
----------------------


Ich benutze Programmers Notepad2 und WinAVR g++/c++.exe.

Gruss

Henk

Thorsten
24.02.2005, 18:29
Flag=1;
while(Flag) {
start_some_timer(); //generates overflow interrupt after some time
Flag=0;
}


Ist ja logisch, die Schleife wird solange ausgeführt, wie flag nicht 0 ist.
Da flag aber beim ersten durchlauf auf 0 gesetzt wird, wird die
Schleife nur einmal durchlaufen. Der Compiler erkennt das
und optimiert das so, dass im Assembler kein Sprungbefehl mehr
vorkommt.

Die For-Schleife läuft immer durch und start...() wird aufgerufen wenn
flag gesetzt ist, danach wird flag gelöscht.
Wenn du genau das Erreichen willst ersetz einfach for(;; ) durch
while(1).

PicNick
24.02.2005, 19:07
Arexx-Henk, die Erste:

Der Unterschied ist weg, wenn du die bedingung dorthin schreibst,wo sie hingehört, also
while (bedingung) { } <==> for ( ; bedingung ; ) { }

ansonsten: anderes is eben anders

Arexx-Henk, die Zweite:
Was du bewunderst, ist das Ergebnis des Compiler-Optimizers.
while (1) heiß nunmal IMMER, d.h. abfragen braucht er nix, also weg damit
dein zweites Beispiel ist zu sehr pseudocode, kann man nix zu sagen

bluebrother
25.02.2005, 16:03
grad bei Abfragen ist es auch ganz geschickt wenn es nicht so tut wie erwartet mal die Bedingungen komplett auszuschreiben. Also in deinem Fall
while( flag == 1 ) { foo; }
Bedingungen vertauschen ist ein netter Fehler, das kommen dann immer solche Ergebnisse raus.

Arexx-Henk
25.02.2005, 20:43
Hallo Leute,

Dank fur alle Antworten

Ich glaub ich verstehe es und habe falsche Gedanken gemacht.

Ich hatte nicht daruber nachgedacht wenn innerhalb ein while statement die while abfrage negative beantwortet wird das Program die while Schleife verlasst.


Gruss

Henk

Arexx-Henk
26.02.2005, 13:17
Hallo Leute,

noch einmal,

Ich hab die Antwort auf meinem Problem gefunden hier:

https://www.roboternetz.de/phpBB2/viewtopic.php?p=63656#63656

Gruss

Henk