rekursive funktion abbrechen mit tastendruck



  • Hallo ich habe eine rekursive funktion die ich mit tastendruck 'a' abbrechen will.

    void funk(struct a *p, int a)
    {  
       int ib;
       char cKeypressed;
    
       if(cKeypressed != 'a')
       {
          for(forschleife)
          {
                if(abfrage)
                {
                   if(kbhit() == 1)
                   {
                      cKeypressed = getch();
                   }
                   if(cKeypressed != 'a')
                   {                          
                      funk(parameter +1)
                   }
                }
          }
          else
          {
    
          }     
       }
    }
    

    doch wenn ich jetzt eine taste drücke reagiert die funktion nicht und berechnet einfach weiter. Hat einer eine idee wieso nicht auf den tastendruck reagiert wird?

    mfg



  • char cKeypressed;
    if(cKeypressed != 'a')
    

    Diese if-Abfrage wird immer true ergeben, da du char nicht initalisierts.
    Wo soll da ein 'a' herkommen?



  • mit
    [code]
    if(kbhit() == 1)
    {
    cKeypressed = getch();
    }
    if(cKeypressed != 'a')
    {
    funk(parameter +1)
    }
    [\code]

    frag ich ab ob taste gedrückt wird und ob a gedrückt wird



  • char cKeypressed;   
       if(cKeypressed != 'a')
    

    was glaubst du, was bei dem if in cKeypressed drin steht?



  • Anfangs irgendwas. aber sobald ich das a auf der tastatur drücke wird es ja mit getch()cKeypressed übergeben oder liege ich falsch? Dann is ja die abbruchbedingung erfüllt.



  • Hat jemand einen Lösungsvorschlag, wie man den Funktionsabbruch über tasten noch lösen kann?



  • Hi !
    Man kann es mit Tastendruck machen, wenn du die Variable dafür global machst:

    int iKeypressed  = 0;
    int iTestcounter = 0;
    
    void funk()
    {  
    	iTestcounter++;
    	printf( "entered: %d\r" ,iTestcounter );
    
       if( iKeypressed != 'a')
       {
    	  for(;;)
          {
    		 if(kbhit() == 1)
             {
               iKeypressed = getch();
             }
             if( iKeypressed == 'a' ) break;
    		 funk();
          }
       }
    }
    int main ( int argc, char* argv[] ) 
    { 
    	funk();
    	return 0;
    }
    

    Oder wenn du schnell genug das 'a' drücken kannst, noch bevor funk() in der for-Schleife aufgerufen wird. Ansonsten bekommt die nächste funk() Funktion einen eigenen Stack und die Lokale Variable xKeypressed 'merkt' nichts davon 😉
    🙂



  • ok das erklärt wieso der tastendruck nicht bemerkt wird. Danke hat schonmal sehr geholfen. globale Variablen eher nicht. kann man das vielleicht auch mit rückgabewert oder parameter der funktion selber regeln?



  • kannst du das nicht ohne rekursion lösen ? 🙂



  • Du könntest der Funktion einen Rückgabewert geben und diesen dann abfragen:

    int funk()
    {  
      for(;;)
      {
         if(kbhit() == 1)
         {
           if(getch() == 'a')
             return 0;
         }
    
         if(!funk())
           return 0;
       }
    
       return 1;
    }
    


  • Hab es nun so gelöst, das die Funktion immer den char zurück gibt. nun wird nach jedem rekursionsschritt geprüft ob die taste gedrückt wurde. Funktioniert wunderbar.


Anmelden zum Antworten