2011-02-16 4 views
0

J'ai une condition if dans mon code c. si la condition if est vraie, je dois appeler sleep(1) appel système et vérifier à nouveau la condition if. Cela doit être fait pour 9 fois maximum. Si à tout moment pendant les 9 fois, la condition if échoue je devrais revenir de la fonction. Si les 9 fois expire, je devrais appeler une autre fonction. Pour le rendre plus clair, je vais écrire le pseudo-code ci-dessous.Mise en œuvre de la logique du programme C

function1() 
{ 
    count = 0 
    label : if (condition) 
    { 
    count++ 
    sleep(1); 
    if(count < = 9) 
    goto label; 
    } 

    if(count > 9) 
    { 
    return; 
    } 

    function2(); /* if(condition) failed */ 
    return; 
} /* End of function1() */ 

Quelle est la meilleure façon de mettre en œuvre la logique ci-dessus. Je ne préfère pas utiliser l'instruction goto.

Répondre

0

Pour Simon répondre à mes besoins, je modifie sa réponse. Veuillez me dire s'il y a des erreurs

function1() 
{ 
    for(count = 1; count <= 9; ++count) 
    { 
     if(!condition) 
     { 
      function2(); 
      break; 
     } 
     sleep(1); 
    } 

    return; 

} /* End of function1 */ 
+1

Cela semble bon jusqu'à maintenant, mais à moins que cela fasse partie d'un programme multithread, la condition étant une variable ne changera pas. Si sa condition multithread doit être volatile et testée en utilisant des opérations atomiques. Ce que vous avez ici est fondamentalement une implémentation brute d'un mutex/spinlock. – datenwolf

+0

@datenwolf: Merci beaucoup. La partie d'implémentation ci-dessus ne va pas dans une application multithread. –

+0

son point est 'condition' doit être une sorte de fonction, ou au moins mis à jour par une sorte de fonction qui n'est pas indiquée dans votre code. – falstro

4

Vous avez implémenté une boucle for. Ce serait tout à fait équivalent, sauf que le nombre sera 1 même si le premier condition échoue:

function1() 
{ 
    for (count = 1; condition && count <= 9; count ++) 
    { 
    sleep(1); 
    } 

    if(count > 9) 
    { 
    return; 
    } 

    function2(); /* if(condition) failed */ 
    return; 
} /* End of function1() */ 

En C on compte habituellement de zéro si, mais c'est juste une question de style.

function1() 
{ 
    for (count = 0; condition && count < 9; count ++) 
    { 
    sleep(1); 
    } 

    if(count >= 9) 
    { 
    return; 
    } 

    function2(); /* if(condition) failed */ 
    return; 
} /* End of function1() */ 

EDIT

Il est également jugé préférable d'utiliser un seul retour, plutôt que plusieurs si

function1() 
{ 
    for (count = 0; condition && count < 9; count ++) 
    { 
    sleep(1); 
    } 

    if(count < 9) 
    { 
    function2(); /* if(condition) succeeded within 9 tries */ 
    }  
} /* End of function1() */ 
+0

nous aurons besoin d'un seul 'return' à la fin de la fonction1 droite. Je pense que vous l'avez probablement manqué –

+0

@Linux; En fait, puisque vous ne spécifiez pas de type de retour, le type de retour par défaut est 'int', vous devez donc faire' return 0'. Mais vous ne retournez rien alors j'ai supposé que votre type de retour est 'void', auquel cas vous pouvez le laisser à la fin d'une fonction. – falstro

1

Vous pouvez réordonner cela

for(count = 1; count <= 9; ++count) 
{ 
    if(!condition) 
    { 
     function2(); 
     break; 
    } 
    sleep(1); 
} 
+0

Où est le sommeil? – falstro

+0

Salut Roe: j'ai modifié la réponse de Simon et mis à jour. –

+0

Merci, fixé ma réponse. –