Partage
  • Partager sur Facebook
  • Partager sur Twitter

Multiples condition dans un sprintf?

    13 juillet 2018 à 12:58:15

    Bonjour à tous,

    je souhaite afficher sur mon afficheur NHD des valeurs selon les conditions suivantes:

    - J'ai quatre zones et leurs états correspondant. Je souhaite afficher ça sur 2 lignes comme ceci :  

    1:COMPLET  2:OFF

    3: MESSAGE 4:AUTO.

    - Les états de mes zones peuvent être : auto. , complet, fermé, message ou eteint.

     Voici la définition :

    /** @brief Display mode menu texts */
    const unsigned char * const AREA_DISPLAY_MENU_TEXT[INDEX_MODE_NB] =
    {
    	
    	(unsigned char *)"AUTO.",
    	(unsigned char *)"COMPLET",
    	(unsigned char *)"FERME",
    	(unsigned char *)"MESSAGE",
    	(unsigned char *)"ETEINT"
    
    	
    };

    Et la déclaration :

    /** @brief Display mode menu indexes */
    enum
    {
    	INDEX_MODE_AUTO,			/*!< Automatic mode */
    	INDEX_MODE_FULL,			/*!< Full mode */
    	INDEX_MODE_CLOSE,			/*!< Closed mode */
    	INDEX_MODE_MESSAGE,			/*!< Message mode */
    	INDEX_MODE_OFF,				/*!< Mode off */
    	INDEX_MODE_NB				/*!< Number of options in display mode menu */
    };
    /** @brief Display mode menu texts */
    extern const unsigned char * const AREA_DISPLAY_MENU_TEXT[INDEX_MODE_NB];



    Voici comment j'ai défini mes deux lignes qui seront mise en place me permettant d'afficher les états de mes zones : (%s afin de spécifier que je souhaite afficher une chaine de caractère correspondant à l'état de la zone en question) :

    La définition :

    /** @brief Areas state menu texts */
    const unsigned char * const AREAS_STATE_MENU_TEXT[AREAS_STATE_MENU_NB] =
    {
    
    	(unsigned char *)"1 : %s   2 : %s",
    	(unsigned char *)"3 : %s   4 : %s",
    
    };


    La déclaration:

    /** @brief Areas state menu indexes */
    enum
    {
    	AREAS_STATE_MENU_1_2,		/*!< state of area 1 and 2 text */
    	AREAS_STATE_MENU_3_4,		/*!< state of area 2 and 3 text */
    	AREAS_STATE_MENU_NB		/*!< Number of texts of the area state screen */
    };
    /** @brief Areas state menu texts */
    extern const unsigned char * const AREAS_STATE_MENU_TEXT[AREAS_STATE_MENU_NB];


    Et voici ma fonction d'affichage ou je place l'état de mes zones dans des buffers grâce à la fonction sprintf me permettant d'afficher le buffer directement sur la ligne souhaitée :

    /**
     * @brief Display and process state area menu
     */
    void stateAreaMenu(void) {
    	uint8_t bufferArea1_2[COLUMN_N+1];
    	uint8_t bufferArea3_4[COLUMN_N+1];
    
    	uint8_t stringResult;
    
    	uint8_t index=0;
    
    	for(index=0; index<4; ++index){
    		if(params.areas[index].areaMode == AREAMODE_AUTO)
    			stringResult=0;
    		if(params.areas[index].areaMode == AREAMODE_FULL)
    			stringResult=1;
    		if(params.areas[index].areaMode == AREAMODE_CLOSE)
    			stringResult=2;
    		if(params.areas[index].areaMode == AREAMODE_MESSAGE)
    			stringResult=3;
    		if(params.areas[index].areaMode == AREAMODE_OFF)
    			stringResult=4;
    	}
    
    	sprintf((char *)bufferArea1_2, (char *)AREAS_STATE_MENU_TEXT[FRENCH][AREAS_STATE_MENU_1_2],stringResult == 0 ?
    			AREA_DISPLAY_MENU_TEXT[FRENCH][INDEX_MODE_AUTO]:AREA_DISPLAY_MENU_TEXT[FRENCH][INDEX_MODE_AUTO]);
    	displayOled(1, bufferArea1_2);
    
    	sprintf((char *)bufferArea3_4, (char *)AREAS_STATE_MENU_TEXT[FRENCH][AREAS_STATE_MENU_3_4],stringResult == 0 ?
    			AREA_DISPLAY_MENU_TEXT[FRENCH][INDEX_MODE_AUTO]:AREA_DISPLAY_MENU_TEXT[FRENCH][INDEX_MODE_AUTO]);
    	displayOled(2, bufferArea3_4);
    }
    • Tout d'abord je déclare mes buffers, avec comme taille la longueur maximum de digit de mon afficheur.
    • Ensuite j'effectue une boucle me permettant de déterminer l'état de ma zone[index] (donc zone[1], zone[2], zone[3] ou zone[4]), selon l'état je donne une valeur différente à ma variable stringResult.
    • Ensuite j'utilise la fonction sprintf, je place dans le buffer ceci (pour le premier sprintf) :
    (unsigned char *)"1 : %s   2 : %s"

     C'est ensuite que je n'arrive pas à faire ce que je souhaite, mon objectif est d'afficher tel ou tel état de ma zone en question, c'est à dire vérifier que ma variable stringResult == tel valeur et en fonction afficher tel ou tel état à mon premier %s et tel ou tel état selon stringResult à mon deuxième %s.

    La condition ternaire que j'utilise fonctionne mais n'est pas ce que je souhaite faire car ici je ne met que deux état possible, je ne fait qu'une vérification d'une zone également il faudrait peut être que je refasse également une boucle pour pouvoir vérifier les 4 zones etc.. mais je ne sais pas comment m'y prendre !

    Merci d'avance pour votre aide, j’espère avoir était claire.

    -
    Edité par Arrgon 13 juillet 2018 à 12:58:55

    • Partager sur Facebook
    • Partager sur Twitter
    Pour réussir dans la vie, il y a deux choses essentielles : 1- Ne jamais révéler tout ce que l'on sait
      13 juillet 2018 à 15:08:24

      alors si j'ai bien compris, ça devrait répondre à ta question :

      Si tu as deux possibilité (max) pour chaque string :

      printf ( "%s : %s\n", ( a )?"string1:string2, ( b )?string3:string4 );

      ici si tu n'a que deux possibilités c'est simple si tu en à plus la ternaire ça peut vite être lourd.

      Si tu à plus de possibilités :

      char str1[] = "text1";
      char str2[] = "text2";
      char str3[] = "text3";
      char str4[] = "text4";
      
      char *str = NULL;
      
      if ( a )
      {
          str = str1;
      }
      else if ( b )
      {
          str = str2;
      }
      ...
      
      printf ( "%s\n", str );




      -
      Edité par ox223252 13 juillet 2018 à 15:10:32

      • Partager sur Facebook
      • Partager sur Twitter

      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

      Mon GitHub

        16 juillet 2018 à 10:27:54

        Merci beaucoup pour ton aide !

        Je suis en train de faire cela mais j'ai un avertissement que je n'arrive pas à régler :

        	uint8_t bufferArea1_2[COLUMN_N+1];
        	uint8_t bufferArea3_4[COLUMN_N+1];
        	uint8_t stringResult[4];
        	uint8_t index=0;
        	uint8_t str1[] = "AUTO.";
        	uint8_t str2[] = "COMPLET";
        	uint8_t str3[] = "FERME";
        	uint8_t str4[] = "MESSAGE";
        	uint8_t str5[] = "ETEINT";
        
        	for(index=0; index<4; ++index){
        		if(params.areas[index].areaMode == AREAMODE_AUTO)
        			stringResult[index] = str1;
        		if(params.areas[index].areaMode == AREAMODE_FULL)
        			stringResult[index] = str2;
        		if(params.areas[index].areaMode == AREAMODE_CLOSE)
        			stringResult[index] = str3;
        		if(params.areas[index].areaMode == AREAMODE_MESSAGE)
        			stringResult[index] = str4;
        		if(params.areas[index].areaMode == AREAMODE_OFF)
        			stringResult[index] = str5;
        	}
        
        	sprintf((char *)bufferArea1_2, (char *)AREAS_STATE_MENU_TEXT[FRENCH][AREAS_STATE_MENU_1_2], stringResult[0], stringResult[1]);

        Pour chaque [index] je lui met la chaine de caractère correspondante, sauf que ici j'ai des erreurs au lignes stringResult[index] = strx;

        warning: assignment makes integer from pointer without a cast [enabled by default]

        Merci beaucoup

        • Partager sur Facebook
        • Partager sur Twitter
        Pour réussir dans la vie, il y a deux choses essentielles : 1- Ne jamais révéler tout ce que l'on sait
          16 juillet 2018 à 11:35:09

          c'est normal, stringResult[4] est un tableau(si tu veux c'est un pointeur qu'on peux pas changer) et pas un pointeur, toi ce qu'il de faut c'est un simple pointeur genre :

          char *stringResult = NULL;
          stringResult = str5;



          • Partager sur Facebook
          • Partager sur Twitter

          la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

          Mon GitHub

            16 juillet 2018 à 12:50:26

            Merci pour ta réponse!

            Mais dans mon sprintf comment je fais pour vérifier la valeur souhaitée.

            Par exemple si je souhaite connaitre params.areas[3].areaMode et que j'utilise un pointeur comme ceci : stringResult = str5; je vais placer dans stringResult le résultat de areaMode, cependant étant donné que j'ai réalisé une boucle sur toutes les possibilités de areas (donc je récupère les valeurs de chaque zone et les met dans stringResult)

            Les variables suivantes sont placés dans le pointeur stringResult

            • params.areas[0].areaMode
            • params.areas[1].areaMode
            • params.areas[2].areaMode
            • params.areas[3].areaMode

            Mais dans mon sprintf lorsque je souhaite afficher l'état de params.areas[0].areaMode et params.areas[1].areaMode je fais comment pour récupérer ces valeurs la de mon pointeur stringResult ?

            C'est pour ça que j'avais pensé à faire un tableau ou j'enregistrer à l'emplacement de l'index du tableau l'état de la zone mais de cette manière là j'ai l'erreur comme je vous disait :/

            -
            Edité par Arrgon 16 juillet 2018 à 15:22:03

            • Partager sur Facebook
            • Partager sur Twitter
            Pour réussir dans la vie, il y a deux choses essentielles : 1- Ne jamais révéler tout ce que l'on sait

            Multiples condition dans un sprintf?

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown