Vermeidung von goto



  • Ich bin C-Anfänger und komme bei dieser Frage nicht weiter:
    Wie kann ich beim folgende Programm "goto" vermeiden?
    Wie kann ich nach Loop1/Loop2 springen ohne goto?

    ```   Loop1:
             if ( 0 == !((MERKER & 0b00000010)))  //MERKER, Bit 1 = 1?
                   { SET_FLAG(2); goto Loop2; }   // Ja: Weiter mit Loop2
    
             if (PORTAbits.RA1 == 1)              // Nein: PORTA, RA1 = 1? 
                   { goto Loop1; }                // Ja: Weiter mit Loop1
    
          Loop2:
            INTCONbits.GIE = 0;             // Nein: Interrupt ausschalten


  • do
    {
    // if ( 0 == !((MERKER & 0b00000010)))  //MERKER, Bit 1 = 1?
       if( MERKER & 0b00000010 ) // Bit 1 gesetzt?
       { 
          SET_FLAG(2);
          break;
       }
    }
    while( PORTAbits.RA1 == 1 );
    INTCONbits.GIE = 0;
    


  • Herzlichen Dank für diese wahnsinnig schnelle Hilfe!
    Dass muss ich als Anfänger erst mal näher untersuchen, um das zu verstehen.
    Dazu muss ich mir den Befehl "Break" mal anschauen.
    Ich nehme an, das ist so etwas, wie "Return" bei Funktionen...



  • Nicht ganz... break verlässt die umgebende Schleife (for, do..while und while..do).



  • Nach "break" geht es wunschgemäß weiter bei Zeile 11, weil "while" noch zur Schleife gehört.
    Wenn die Bedingung in Zeile 10 nicht erfüllt wird, geht es dann weiter bei Zeile 4?
    Erst wenn die Bedingung in Zeile 10 erfüllt wird, geht es weiter bei Zeile 11, oder?



  • Andersrum: Die Schleife bleibt am laufen solange die Bedingung wahr ist.



  • Ja, vielen Dank für die Erklärung.

    Hoffentlich meine letzte Frage:
    Wieso ist

    
    ```if (MERKER & 0b00000010) ```c
    
    

    das Gleiche wie

    
    ```if (0 == !((MERKER & 0b00000010)))```c
    
    

    Im zweiten Ausdruck wird doch mit "!" negiert, damit nur das Bit 1 bei MERKER abgefragt wird.
    Ausserdem: Wenn "== 0" nicht angegeben wird, bedeutet dies automatisch "==0" ?



  • @buschi sagte in Vermeidung von goto:

    Im zweiten Ausdruck wird doch mit "!" negiert, damit nur das Bit 1 bei MERKER abgefragt wird.

    Was hat negieren mit Bit 1 abfragen zu tun?



  • @buschi sagte in Vermeidung von goto:

    Ja, vielen Dank für die Erklärung.

    Hoffentlich meine letzte Frage:
    Wieso ist (...) das Gleiche wie (...)

    Weil das eine gar nicht negiert und das andere doppelt.

    Ausserdem: Wenn "== 0" nicht angegeben wird, bedeutet dies automatisch "==0" ?

    Nein. if (x) ist nicht das selbe wie if (x == 0) sondern das selbe wie if (x != 0).



  • @manni66

    Ja, richtig und das "!" ist falsch. Danke für die Starthilfe...


Log in to reply