- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 7 von 7

Thema: 'While' functioniert nicht?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    67
    Beiträge
    531

    'While' functioniert nicht?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Programmierer,

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

    Mein Program:

    Code:
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    67
    Beiträge
    531
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    41
    Beiträge
    237
    Code:
      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).
    Open Minds. Open Sources. Open Future

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2004
    Ort
    Karlsruhe
    Beiträge
    223
    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.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    67
    Beiträge
    531
    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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    67
    Beiträge
    531
    Hallo Leute,

    noch einmal,

    Ich hab die Antwort auf meinem Problem gefunden hier:

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

    Gruss

    Henk

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests