Aide pour un switch[case]
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

Aide pour un switch[case]



  1. #1
    DADYCOKE

    Aide pour un switch[case]


    ------

    Bonjour, excusez moi ces derniers temps je pose trop de question concernant le C/C++ ( je travail sur un projet la dessus ).

    Mon nouveau problemes concerne les switch[case].
    voila j'ai un programme qui passe par 4 etats possible( pour l'instant)

    Code:
    switch(etat) {
         case etat_1 :{
                 //tache
    
                varString = fonction_qui_renvoi_string();
    
                // std::cout << "debug\n";         // pour voire si le programme sort de la fonction
    
                //D'autre tache
         }
    
        case etat_2:{
        //Tache
       }
    le probleme c'est que le programme ne sort pas après le return de la fonction_qui_renvoi_string();

    merci pr votre aide

    -----

  2. #2
    Jack
    Modérateur

    Re : Aide pour un switch[case]

    D'une manière générale ne pas oublier le break à la fin de chaque case, sinon tu vas exécuter tous les autres case suivants

  3. #3
    DADYCOKE

    Re : Aide pour un switch[case]

    Eureur de syntaxe, j'ai du l'oublié mais l'eureur ne vient pas de la, car dans mon programme les break sont bien présent.
    Code:
    switch(etat) {
         case etat_1 :{
                 //tache
    
                varString = fonction_qui_renvoi_string();
    
                // std::cout << "debug\n";         // pour voire si le programme sort de la fonction
    
                //D'autre tache
          break;
         }
    
        case etat_2:{
        //Tache
        break;
       }
    Est ce qu'il faut pas sortir de la fonction_qui_renvoi_string() avec autre chose que le simple " return leString "

  4. #4
    Jack
    Modérateur

    Re : Aide pour un switch[case]

    on ne sait pas de quel type sont tes variables, ni le type de la valeur de retour de la fonction. Difficile de travailler en aveugle.

    A+

  5. A voir en vidéo sur Futura
  6. #5
    deyni

    Re : Aide pour un switch[case]

    Bonjour,

    j'ai l'impression qu'il manque le cas: "default"

    ps: essayez-vous de faire une machine à état fini?
    Deynid'oiseaux partout !! :rire:

  7. #6
    lou_ibmix_xi

    Re : Aide pour un switch[case]

    Je pense que ton problème vient des accolades entourant le corps du "case", elles ne servent à rien, et à priori il te suffit de sortir le "break" des accolades.

  8. #7
    DADYCOKE

    Re : Aide pour un switch[case]

    Bonjour les amis, je reviens vers vous après avoir testé vos suggestions.

    @deyni
    j'ai l'impression qu'il manque le cas: "default"

    ps: essayez-vous de faire une machine à état fini?
    J'ai bien mis le cas default ( merci de me l'avoir rapellé d'ailleur) => Hélas pas de changement
    Oui j'essai de faire une machine a etat fini (en gros je n'aurais que 4 etat etat pas plus)

    @lou_ibmix_xi => pas de changement après avoir enlevé les accolades

    @Jack voila le code de la fonction qui retourne le string ( le programme principale entre dans cette fonction mais ne ressort pas => Donc le probleme vient d'ici apparement)
    J'utilise une bibliotheq écrite en c++ ( c'est pas mois qui l'ai écris on est bien d'accord) pour pouvoir connecter un clavier a une raspberry. J'ai uniquement fait quelque astuce pour l'adapter a mon clavier ( qui en passant est un mauvais choix de clavier)

    Code:
    // Use the Rpi-hw namespace
    using namespace rpihw;
    
    std::string saisie_Clavier(){
    
    	// Matrix keypad controller
    	keypad::matrix disp( 4, 4, 11, 9, 22, 27, 3, 4, 14, 15 );
    	// Iterator
    	size_t i;
    	unsigned int count = 0;
    	std::string leCode = "";
    	int Tab[4] = {0};
    	// Main loop
    	while (count < 4) {
    		// Write the buttons state
    		const bitset &keystate = disp.state();
    		for ( i = 0; i < keystate.size(); i++ ) {
    			utils::msleep(10);
    			if (keystate[i] == 1) {
    				if (!((i < 3) && (keystate[i+1] == 1))){
    					printf("touche %d pressed\n", i);
    					Tab[count] = i;
    					++count;
    				}
    
    				else {
    					if ((i = 3) && (keystate[i-1] == 0)){
    						printf("touche %d pressed\n", i);
    						Tab[count] = i;
    						++count;
    					}
    			    	 	else {
    						if (i > 3){
    							printf("touche %d pressed\n", i);
    							Tab[count] = i;
    							++count;
    						}
    					}
    				}
    			}
    		}
    		int initialisation = 1;
    
    
    		// Wait some time
    		utils::msleep (200);
    	}
    	std::stringstream ss;
    	for(int i =0;i<count;i++){
    		ss.str("");
    		ss << Tab[i];
    		leCode += ss.str();
    
    	}
    	printf("%s \n", leCode.c_str()) ;
    	return leCode;
    }
    Just une question : ma fonction "main" ( dans lequel il y a le switch case est défini dans l'espace de nom " std" or celle qui gère le clavier est dans l'espace de nom "rpi-hw" . D'ou ma question le problème viendrait il de la par hasard ??
    Dernière modification par DADYCOKE ; 26/02/2013 à 10h48.

  9. #8
    Dlzlogic

    Re : Aide pour un switch[case]

    Bonjour,
    J'ai l'impression qu'il y a quelques petites incompréhension dans l'utilisation d'un switch(cas).
    1- L'instruction switch est un ordre de saut calculé. C'est à dire que les différentes valeurs de cas ont été prévues (et on peut rajouter "default" pour signaler un cas non prévu).
    2- lorsque le cas correspond à l'une des étiquettes (case le programme s'y rend directement (jump) et continue en séquence jusqu'à ce qu'il trouve un break; ou l'accolade fermante du switch. Ce n'est pas une faute, de mettre plusieurs case: sans mettre de break, c'est un choix.
    3- Chaque bloc d'un case correspond à un bloc contenu entre une étiquette de jump et la fin du bloc. Ce qui entraine qu'on ne peut pas faire d'initialisation dans ce bloc. La solution pour "tromper le compilateur" est de mettre une accolade ouvrante après le case et ne pas oublier l'accolade fermante.
    Dans votre code, ci-dessous, j'aurais très bien vu un switch dans la boucle for.
    Petit détail, la condition de la boucle for est un size(), donc une fonction qui sera évaluée à chaque fois.
    Soit c'est une constante, alors il vaut mieux le calculer une seule fois, soit cette valeur est susceptible d'évoluer, alors le code est difficile à lire.

  10. #9
    DADYCOKE

    Re : Aide pour un switch[case]

    @Dlzlogic : le code que j'ai mis n'est pas le switch case. Mon switch case est de la forme la ( voir depuis le debut) :
    Code:
    switch(etat) {
         case etat_1 :{
                 //tache
    
                varString = fonction_qui_renvoi_string();
    
                // std::cout << "debug\n";         // pour voire si le programme sort de la fonction
    
                //D'autre tache
         }
    
        case etat_2:{
        //Tache
       }
    le code que j'ai mis correspond a la "fonction_qui_renvoi_strin g() " (qui se trouve dans mon switch case).

    Le probleme c'est que lors de l'execution dans ma fonction main qui contient le switch le programme rentre dans la fonction mais n'en ressort pas pour continuer dans le switch
    Dernière modification par DADYCOKE ; 26/02/2013 à 12h03.

  11. #10
    DADYCOKE

    Re : Aide pour un switch[case]

    d'ou ma question:
    Just une question : ma fonction "main" ( dans lequel il y a le switch case est défini dans l'espace de nom " std" or celle qui gère le clavier est dans l'espace de nom "rpi-hw" . D'ou ma question le problème viendrait il de la par hasard ??

  12. #11
    Dlzlogic

    Re : Aide pour un switch[case]

    Oui, mon intervention n'avait pour but que de clarifier l'utilisation du switch.
    Question : quand vous donnez l'instruction
    printf("le code : %s\n",LeCode.c_str());
    votre compilateur impose-t-il l'appel de la fonction c_str(), ou c'est juste un choix ?

    if ((i = 3) && (keystate[i-1] == 0)){
    Là je vois pas très bien ce que vous faites , vous mettez i à 3, je sais pas trop ce qui se passe après.

    Je veux bien vous le déboguer, mais il me faudrait tout le code.
    Dernière modification par Dlzlogic ; 26/02/2013 à 12h18.

  13. #12
    DADYCOKE

    Re : Aide pour un switch[case]

    printf("le code : %s\n",LeCode.c_str());
    c'est just une eureur d'inattention normalement
    printf("le code : %s\n",LeCode);
    pour voir le code saisi.

    if ((i = 3) && (keystate[i-1] == 0)){
    Là je vois pas très bien ce que vous faites , vous mettez i à 3, je sais pas trop ce qui se passe après.
    Comme je l'ai dit un peu plus haut j'utilise un clavier(genre digicode en matrice qui est un mauvais choix)
    les 4 premiers touches sont a etat 1 quand on les appui pas é seul celui qu'on appui rest a l'etat 1 une fois appuyé ( tandis que tout les autres touches du clavier sont a l'etat 0 si il sont pas appuyé et passe a l'etat 1 quand on les appuie). Donc cette partie ne sert qu'a testé ca pour différencié si il a été appuyé ou pas et pour ca je le compare avec l'etat du bouton just avant lui

  14. #13
    Dlzlogic

    Re : Aide pour un switch[case]

    Oui, ce que je veux dire, c'est que si le programme arrive là, cad si "i n'est pas plus petit que 3) alors i sera toujours égal à 3.
    Donc, la séquence "if (i > 3)" ne peut jamais être atteinte.

    Concernant l'appel de c_str(), ce n'est pas une faute, juste une curiosité de ma part.

  15. #14
    DADYCOKE

    Re : Aide pour un switch[case]

    je suis pas d'accord. J'ai bien 3 cas :

    si i<3
    si i=3
    le reste ( i> 3)

    Rectification : un peu plus haut
    printf("le code : %s\n",LeCode.c_str());
    c'est just une eureur d'inattention normalement
    printf("le code : %s\n",LeCode);
    Faux j'avais di ca sans testé a vu d'oeil comme "leCode" est défini en string (%s doit l'afficher normale or c'est pas le cas mon compilateur impose l'utilisation de .c_str()) donc C'ETAIT BON au DEPART

  16. #15
    Dlzlogic

    Re : Aide pour un switch[case]

    Si vous écrivez "if (i = 3)"
    Alors, maintenant i vaut 3 et je crois que la condition est considérée comme vraie.
    Par contre, si vous écrivez "if(i == 3)" (l'opérateur de comparaison à l'identique en C s'écrit '==')
    alors la suite sera exécutée si i vaut 3 (trois) mais 'i' ne sera pas modifiée.

    Puisque vous débutez en matière de test, évitez ce genre de chose :
    if (!((i < 3) && (keystate[i+1] == 1)))
    Concernant le c_srt(), je n'ai jamais dit que c'était une faute, mon compilateur n'en a pas besoin.
    Si j'étais vous, je testerais tous les cas de 'i', dans un switch. Le code sera un peu plus long en nombre de lignes, mais en temps de traitement, mais beaucoup plus clair.
    Dernière modification par Dlzlogic ; 26/02/2013 à 13h11.

  17. #16
    DADYCOKE

    Re : Aide pour un switch[case]

    oh vs avez tt a fait raison dsolé j voulais if i==3

  18. #17
    DADYCOKE

    Re : Aide pour un switch[case]

    Bon je suis de retour

    j'ai suivi ton conseil @Dlzlogic (en tant que debutant => j balance du code debutant ) donc j'ai changé les test en switch mais ca n'explique toujours pas mon problem de départ

    Code:
    std::string saisie_Code(){
    
    	// Matrix keypad controller
    	keypad::matrix disp( 4, 4, 11, 9, 22, 27, 3, 4, 14, 15 );
    	// Iterator
    	int i;
    	unsigned int count = 0;
    	std::string leCode = "";
    	int Tab[4] = {0};
    	// Main loop
    	while (count < 4) {
    		// Write the buttons state
    		const bitset &keystate = disp.state();
    		int cas;
    		for ( i = 0; i < keystate.size(); i++ ) {
    //			printf("%d\n", keystate[i]);
    			utils::msleep(10);
    //			if (keystate[i] == 1) {
    				if (i < 3)
    					cas = 1;
    				else if (i > 3)
    					cas = 3;
    				else
    					cas = 2;
    				switch (cas)
    				{
    					case 1:
    					   if (keystate[i] == 1 && keystate[i+1] == 0){
    						Tab[count] = i;
    						printf("touche %d \n", i);
    						++count;
    					   }
    					   break;
    					case 2:
    					   if (keystate[i] == 1 &&keystate[i-1] == 0){
    						Tab[count] == i;
    						printf("touche %d\n",i); 
    						++count;
    					   }
    					   break;
    					case 3:
    					  if(keystate[i] == 1 ){
    						Tab[count] = i;
    						printf("touche %d\n", i);
    						++count;
    					  }
    					  break;
    					default:
    					  printf(" EUREUR\n");
    				}
    
    //			}
    		}
    		// Wait some time
    		utils::msleep (200);
    
    	}
    	std::stringstream ss;
    	for(int i =0;i<count;i++){
    		ss.str("");
    		ss << Tab[i];
    		leCode += ss.str();
    
    	}
    //	printf("%s \n", leCode.c_str()) ;
    	return leCode;
    }
    Dernière modification par DADYCOKE ; 26/02/2013 à 15h26.

  19. #18
    DADYCOKE

    Re : Aide pour un switch[case]

    A la fin du programme en HAUT , le programme ne sort pas pour continuer sur la fonction principale

    switch(etat) {
    case etat_1 :{
    //tache

    leCode_recuperer = SaisiCode();

    //D'autre tache
    }

    case etat_2:{
    //Tache
    }
    Dernière modification par DADYCOKE ; 26/02/2013 à 15h29.

  20. #19
    Chanur

    Re : Aide pour un switch[case]

    Bonjour,

    Le "for ( i = 0; i < keystate.size(); i++ )" pouvait conduire à une boucle sans fin à cause de l'erreur sur le test i==3

    Le "while (count < 4)" peut conduire à une boucle sans fin. Notamment dans le cas où keystate.size() < 3, il se peut qu'aucune des conditions pour incrémenter count ne soit réalisée (puisque i restera inférieur à 3).

    Je ne comprends pas bien l'intérêt de "if (!((i < 3) && (keystate[i+1] == 1)))"
    Ce serait plus clair en écrivant "if (i>=3 || keystate[i+1] != 1)"
    Et on voit mieux qu'on ne peux pas passer dans les autres cas ...


    Difficile d'être plus précis sans connaître le contenu de keystate ...

    A+
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  21. #20
    DADYCOKE

    Re : Aide pour un switch[case]

    Je ne comprends pas bien l'intérêt de "if (!((i < 3) && (keystate[i+1] == 1)))"
    Ce serait plus clair en écrivant "if (i>=3 || keystate[i+1] != 1)
    Et on voit mieux qu'on ne peux pas passer dans les autres cas ...
    J'ai changé tout ca en utilisant le code que j'ai mis en derniere position
    Merci

  22. #21
    DADYCOKE

    Re : Aide pour un switch[case]

    je vais résumé un peu le tout :

    premier programme :

    Code:
    using namespace std;
    switch(etat) {
    case etat_1 :{
    //tache
    
    leCode_recuperer = Saisi_Code();  //recuperation d'un code renvoyé par la fonction Saisi_Code
    printf("debug") // pour voir que le programme continue bien apres la ligne précédente  CE QU'IL NE FAIT PAS D'AILLEUR
    
    //D'autre tache
    }
    
    case etat_2:{
    //Tache
    }
    Deuxieme programme qui correspond a la fonction Saisi_Code() qui se trouve en haut
    Code:
    using namespace rpihw;
    std::string saisie_Code(){
    
    	// Matrix keypad controller
    	keypad::matrix disp( 4, 4, 11, 9, 22, 27, 3, 4, 14, 15 );
    	// Iterator
    	int i;
    	unsigned int count = 0;
    	std::string leCode = "";
    	int Tab[4] = {0};
    	// Main loop
    	while (count < 4) {
    		// Write the buttons state
    		const bitset &keystate = disp.state();
    		int cas;
    		for ( i = 0; i < keystate.size(); i++ ) {
    //			printf("%d\n", keystate[i]);
    			utils::msleep(10);
    //			if (keystate[i] == 1) {
    				if (i < 3)
    					cas = 1;
    				else if (i > 3)
    					cas = 3;
    				else
    					cas = 2;
    				switch (cas)
    				{
    					case 1:
    					   if (keystate[i] == 1 && keystate[i+1] == 0){
    						Tab[count] = i;
    						printf("touche %d \n", i);
    						++count;
    					   }
    					   break;
    					case 2:
    					   if (keystate[i] == 1 &&keystate[i-1] == 0){
    						Tab[count] == i;
    						printf("touche %d\n",i); 
    						++count;
    					   }
    					   break;
    					case 3:
    					  if(keystate[i] == 1 ){
    						Tab[count] = i;
    						printf("touche %d\n", i);
    						++count;
    					  }
    					  break;
    					default:
    					  printf(" EUREUR\n");
    				}
    
    //			}
    		}
    		// Wait some time
    		utils::msleep (200);
    
    	}
    	std::stringstream ss;
    	for(int i =0;i<count;i++){
    		ss.str("");
    		ss << Tab[i];
    		leCode += ss.str();
    
    	}
    //	printf("%s \n", leCode.c_str()) ;
    	return leCode;
    }

    ma question :
    ma fonction "main" ( dans lequel il y a le switch case est défini dans l'espace de nom " std" or celle qui gère le clavier est dans l'espace de nom "rpi-hw" . D'ou ma question le problème viendrait il de la par hasard ??

  23. #22
    Dlzlogic

    Re : Aide pour un switch[case]

    Bon, la variable "cas" c'était juste le texte. Dans le cas présent, il faudrait faire quelque-chose conne ça
    je récris juste ça :
    for ( i = 0; i < keystate.size(); i++ ) {
    // printf("%d\n", keystate[i]);
    utils::msleep(10);
    // if (keystate[i] == 1) {
    if (i < 3)
    cas = 1;
    else if (i > 3)
    cas = 3;
    else
    cas = 2;
    switch (cas)
    {
    case 1:
    if (keystate[i] == 1 && keystate[i+1] == 0){
    Tab[count] = i;
    printf("touche %d \n", i);
    ++count;
    }
    break;
    case 2:
    Code:
                    int MAX=keystate.size();
    		for ( i = 0; i < MAX ; i++ ) 
                   {
    			utils::msleep(10);
                      switch (i)
                      {
                         case 0:
                         case 1:
                         case 2:
    				if (keystate[i] == 1 && keystate[i+1] == 0)
                                   {
    				  Tab[count] = i;
    				  printf("touche %d \n", i);
    				 ++count;
    				}
                                    else // Que fait-on ?
                                    {
                                    }
    		     break;
                         case 3:
    				 if(keystate[i] == 1 )
                                    {
    				  Tab[count] = i;
    				  printf("touche %d\n", i);
    				  ++count;
    				}
                                    else // que fait-on ?
                                    {
                                    }
    		    break;
                       case 4:
                       case 5: etc.
                        traitement
                       break;
    		   default:
    			  printf(" EUREUR\n");
                     } // accolade fermante du switch         
    A continuer
    Je sais, j'ai l'habitude de mettre l'accolade fermante au même rang que l'accolade ouvrante.

  24. #23
    Jack
    Modérateur

    Re : Aide pour un switch[case]

    Pour l'espace de nom, il ne doit pas y avoir de problème puisque dans le namespace rpihw ne figure aucun nom identique a ceux du namespace std.

    A+

  25. #24
    DADYCOKE

    Re : Aide pour un switch[case]

    Merci pr votre Aide a tout le monde

    Apres m'avoir inspiré de ton code @Dlzlogic toujour pas de changement mais mon clavier fonctionne bien et renvoi bien les touches. Ce qui m'a ramené a mon probleme de départ " le programme principale appel la fonction clavier puis n'en ressort plus".

    C'est alor que j'ai tenté "un coup de Maitre"
    J ai déplacé la ligne suivante
    Code:
    keypad::matrix disp( 4, 4, 11, 9, 22, 27, 3, 4, 14, 15 );
    en la placant au début du fichier( avant la fonction)

    ( voir le code que j'ai mis un peux plus dans la discution )

    Quelqu'un pourrai m'expliquer ce que j'ai changé ?? parceque je vois plus

    PS : le probleme n etais pas le switch

  26. #25
    Dlzlogic

    Re : Aide pour un switch[case]

    Bonjour,
    Là, vous utilisez des spécificités de C++ que je ne connais pas.
    D'ailleurs, même la syntaxe me surprend un peu.
    D'abord un type : keypad::matrix (je ne connais ni keypad ni matrix)
    puis un appel de la fonction disp avec 10 paramètres.
    Ca pourrait être un appel de constructeur ???

  27. #26
    DADYCOKE

    Re : Aide pour un switch[case]

    au fait c'est une bibliotheque ecrite en c++ pour utiliser un clavier sur une raspberry . Regarde ce lien http://www.hackyourmind.org/blog/rpi...matrix-keypad/

  28. #27
    Dlzlogic

    Re : Aide pour un switch[case]

    Oui, mais ça n'explique pas le fonctionnement de cette classe. Il faudrait voir les 3 fichiers hpp qui sont en include.
    D'autre part, je remarque dans l'exemple, disp prend 9 paramètres, et 10 dans votre cas.
    Si disp fait une initialisation, comme je le pense, cette instruction doit n'être exécutée qu'une seule fois.

  29. #28
    DADYCOKE

    Re : Aide pour un switch[case]

    Oui, mais ça n'explique pas le fonctionnement de cette classe. Il faudrait voir les 3 fichiers hpp qui sont en include.
    On peut telecharger les 3 fichiers sur le site.

    D'autre part, je remarque dans l'exemple, disp prend 9 paramètres, et 10 dans votre cas.
    Comme je l'ai dit plus haut mon clavier "qui cela dit est pourri" n'est pas le meme (c'est une matrice 4*4 différents de celui de l'exemple 3*3 mais c'est pas le problème car la classe peut supporter des matrices n*n) ce qui fait que j'ai 10 parametre
    Dernière modification par DADYCOKE ; 27/02/2013 à 13h40.

  30. #29
    Dlzlogic

    Re : Aide pour un switch[case]

    Oui, je me doutais d'un truc comme ça, mais 4x4, ça fait 16 et non pas 10.
    Autrement dit, même s'il y a 6 touches qui ne servent à rien, le tableau d'adressage (que vous appelez matrice) doit contenir 4 lignes et 4 colonnes, soit 16 positions.

  31. #30
    DADYCOKE

    Re : Aide pour un switch[case]

    voici le constructeur de la classe

    keypad::matrix( COLUMS, ROWS, /* Column pins */ COL0, COL1, COL2, ..., /* Rows pins */ ROW0, ROW1, ROW2, ... )
    si je l'adapte a mon clavier qui a 4 colonne et 4 ligne on aura

    keypad::matrix( 4, 4, /* Column pins */ COL0, COL1, COL2, COL3, /* Rows pins */ ROW0, ROW1, ROW2, ROW3)
    Les deux premiers parametre ne servant qu'a indiquer la taille de la matrix exempl 4*4

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. langage C incrementation dans switch case....
    Par inviteac751535 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 06/04/2010, 09h50
  2. Réponses: 2
    Dernier message: 08/12/2009, 14h41
  3. Utilisation de switch avec un autre switch
    Par invitef69a6111 dans le forum Électronique
    Réponses: 0
    Dernier message: 02/10/2009, 18h10
  4. inverser un switch (pour de l'audio)?
    Par invite0183d602 dans le forum Électronique
    Réponses: 6
    Dernier message: 24/05/2009, 09h50