2009-06-30 8 views
0

Est-ce que C++ a un quelconque type d'utilitaire pour retourner au début d'une fonction après un appel de fonction? Par exemple, par exemple l'appel à help() dans la fonction calculate. Bien que techniquement ma mise en œuvre d'une fonction d'aide fonctionne bien, ce n'est pas parfait. Après que l'aide est appelée, et retourne, il continue à essayer de cout < < résultat < < instruction() < < endl; ce qui n'est pas possible car aucune valeur n'a été entrée. Ainsi, il donne un petit message d'erreur (ailleurs dans le programme) et continue ensuite avec le programme. Pas de problème de fonctionnalité, mais c'est moche et je ne l'aime pas (: P).Méthode pour retourner au début de la fonction

Y a-t-il un moyen pour que la fonction d'aide revienne, pour revenir au début du calcul et recommencer? (J'ai joué avec l'insertion d'un appel de fonction dans le bloc if (t.kind == help_user) pour appeler calculer, mais comme je me suis dit que ça retarde le problème plutôt que de le résoudre.)

+0

Ou si vous venez défiler vers le bas un peu, vous constaterez que vous pouvez le faire sans poursuivre un simple changement à votre logique, comme ne pas exécuter le code que vous ne voulez pas ... – stefanB

Répondre

5

Vous pouvez utiliser goto, mais le moment où vous faites vous-même compte plus. C'est considéré comme une mauvaise pratique et les bons usages sont rares et éloignés.

Je pense que ce que vous cherchez est de continuer:

void do_calculate(void) 
{ 
    while (true) 
    { 
     cout << prompt; 
     Token t = ts.get(); 

     if (t.kind == help_user) 
     { 
      help(); 
      continue; // <- here 
     } 
     else if (t.kind == quit) 
     { 
      return; 
     } 

     while (t.kind == print) 
     { 
      t = ts.get(); 
     } 
     ts.unget(t); 

     cout << result << statement() << endl; 
    } 
} 

void calculate() 
{ 
    try 
    { 
     do_calculate(); 
    } 
    catch (const std::exception& e) 
    { 
     cerr << e.what() << endl; 
     clean_up_mess(); 
    } 
} 

J'ai aussi reformater votre code. Je pense que c'est plus lisible, à chacun son sien, mais je voulais juste vous laisser comparer.

  • La clause try/catch n'interfère plus avec la fonction de calcul.

  • Les instructions 'if' utilisent des crochets pour la cohérence. En outre, il est beaucoup plus facile à lire, car sais quel que soit le contrôle de if est entre parenthèses.

  • La capture interceptera une exception std ::, plutôt que runtime_error. Toutes les exceptions standard héritent de std :: exception, donc en attrapant que vous savez que vous pouvez attraper n'importe quoi.

+0

Toutes les bonnes réponses! Je viens de choisir celui-ci parce qu'il était en haut: P Je ne savais pas à propos de continuer, mais maintenant je vous remercie! – Alex

5

Ceci pourrait être ce que vous êtes à la recherche de?

if (t.kind == help_user) { 
    help(); 
    continue; 
} 
+0

Toutes les bonnes réponses! Je viens de choisir l'autre parce que c'était en haut: P Je ne savais pas continuer, mais maintenant je vous remercie! – Alex

2

Vous pouvez revenir au sommet d'une boucle avec la déclaration continue. C'est la meilleure façon d'obtenir ce que vous voulez puisque vous avez une boucle while autour de votre code:

if (t.kind == help_user) { 
    help(); 
    continue; 
} 

Il y a aussi la déclaration goto bien que ce soit presque toujours une mauvaise idée. Je vous laisse le soin de lire par vous-même. Pour plus d'informations, lisez "flow control".

Dans ce cas précis, je serais probablement opter pour la restructuration que votre code légèrement en ajoutant une déclaration else, comme ceci:

if (t.kind == help_user) 
     help(); 
    else if (t.kind == quit) 
     return; 
    else { 
     while (t.kind == print) 
      t=ts.get(); 
     ts.unget(t); 

     cout << result << statement() << endl; 
    } 
+0

Toutes les bonnes réponses! Je viens de choisir l'autre parce que c'était en haut: P Je ne savais pas continuer, mais maintenant je fais merci! – Alex

1

Oui, il est appelé logique:

void calculate() 
{ 
    while(true) 
    { 
    try { 
     cout << prompt; 
     Token t = ts.get(); 
     if (t.kind == help_user) 
      help(); 
     else 
     { 
      if (t.kind == quit) return; 
      while (t.kind == print) t=ts.get(); 
      cout << result << statement() << endl; 
     } 
     ts.unget(t); // if statement above needs this then leave it in and 
         // add one call after help() as well ... not sure from code 
    } 
    catch(runtime_error& e) { 
     cerr << e.what() << endl; 
     clean_up_mess(); 
    } 
} 
Questions connexes