Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Fonction comme parametre de condition
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » sam. 21 janv. 2017 15:05

Bonjour à tous,

Toujours sur mon module GSM, j'ai repris depuis le debut !

Une fonction me turlupine car je n'arrive pas à la simplifier

Voici la fonction d'origine

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Get GSM response, if there is any
short Get_response() {
    if (
response_rcvd) {   // Si il y a une reponse qui est finie  (flag levé)
      
response_rcvd 0;   // RAZ du flag
      
return responseID;   // On renvoie l'identification de la réponse
    
}
    else
      return -
1;           // Sinon on renvoie -1
}

// Attente de la réponse du GSM (boucle infinie)
void Wait_response(char rspns) {
char test = 1;

  while (test){
  test = Get_response();
  if ((test == rspns) || (test == GSM_ERROR))
    test = 0;
  else
    test 
= 1;
  }



En paramètre on lui dit la réponse que l'on attend
On va chercher la réponse et on la place dans la variable "test".

Si cette réponse est égale a la réponse attendue ou on reçoit une erreur alors on sort, sinon on attend encore !

Plutôt bien fait mais je pense qu'on doit pouvoir raccourcir .
je pensais faire comme cela en pensant que ça revenait au même mais apparemment non car car ne fonctionne pas !

Tant que la réponse est différente de celle attendue ET différente d'erreur alors je boucle!

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Attente de la réponse du GSM (boucle infinie)
void Wait_response(char rspns) {

     while ( (Get_response() != rspns) && (Get_response() != GSM_ERROR) );



Je me demande si ce n'est pas a cause de la fonction qui est deux fois dans les conditions de test !

Qu'en pensez vous ?

Merci
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonction comme parametre de condition
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » sam. 21 janv. 2017 15:56

J'ai trouvé une piste mais je comprends pas trop pourquoi ça ne fonctionne pas avec ma première solution .

Comme ceci ça fonctionne : pensez vous que ce soit fonctionnel !

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Attente de la réponse du GSM (boucle infinie)
void Wait_response(char rspns) {

     while ( (
Get_response() != (rspns && GSM_ERROR) ) );

C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonction comme parametre de condition
brunog
Membre
Membre
Messages : 20
Enregistré en : janvier 2017

#3 Message par brunog » sam. 21 janv. 2017 23:48

Jérémy a écrit :J'ai trouvé une piste mais je comprends pas trop pourquoi ça ne fonctionne pas avec ma première solution .

Comme ceci ça fonctionne : pensez vous que ce soit fonctionnel !

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Attente de la réponse du GSM (boucle infinie)
void Wait_response(char rspns) {

     while ( (Get_response() != (rspns && GSM_ERROR) ) );

}


Hello,
non ça ne fonctionne pas, les deux expressions sont différentes car il n'y a pas de distributivité sur les opérateurs utilisés.

ta fonction Get_response() retourne un résultat qui est dépendant d'une variable qui est elle-même modifiée dans cette fonction : deux appels successifs à cette fonction peuvent donc donner des résultats différents, c'est le cas dans ton bout de code :

Code : Tout sélectionner

     while ( (Get_response() != rspns) && (Get_response() != GSM_ERROR) );

il ne faut faire qu'un seul appel à cette fonction, et stocker le résultat dans une variable intermédiaire. pour cela il faut remplacer le bloc while par un bloc do...while :

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Attente de la réponse du GSM (boucle infinie)
void Wait_response(char rspns) {

     do
         {
         char rep ;
         rep = Get_response() ;
         }
     while ( (rep != rspns) && (rep != GSM_ERROR) );

}
A+,
BrunoG
---
Quelques pico-idées en vrac : http:://www.micro-examples.com

Fonction comme parametre de condition
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » dim. 22 janv. 2017 08:58

Génial ca !

Merci !

Que penses-tu de ma deuxième solution car j'ai un doute sur mes conditions ?

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Attente de la réponse du GSM (boucle infinie)
void Wait_response(char rspns) {

     while ( (
Get_response() != (rspns && GSM_ERROR) ) );

}  
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonction comme parametre de condition
brunog
Membre
Membre
Messages : 20
Enregistré en : janvier 2017

#5 Message par brunog » lun. 23 janv. 2017 14:25

Jérémy a écrit :Génial ca !

Merci !

Que penses-tu de ma deuxième solution car j'ai un doute sur mes conditions ?

Code : Tout sélectionner

//------------------------------------------------------------------------------
// Attente de la réponse du GSM (boucle infinie)
void Wait_response(char rspns) {

     while ( (Get_response() != (rspns && GSM_ERROR) ) );

}

voir dans ma réponse ci-dessus, ça ne marchera pas.
il suffit de prendre un contre exemple :
supposons que get_response() retourne 1 (lors des deux appels successifs), rspns égale 2 et GSM_ERROR égale 3 :
la première expression :
(Get_response() != rspns) && (Get_response() != GSM_ERROR)
donnera :
(1 != 2) && (1 != 3)
= (true && true)
= true
alors que l'expression :
Get_response() != (rspns && GSM_ERROR) 
donnera :
(1 != (2 && 3)) = (true != (true && true))
= true != true
= false
ces deux expressions ne sont donc pas identiques
A+,
BrunoG
---
Quelques pico-idées en vrac : http:://www.micro-examples.com

Fonction comme parametre de condition
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » mar. 24 janv. 2017 08:36

D'accord ! Je pense avoir saisi avec tes explications claires !

:bravo: et Merci !
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 29 invités