Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utilisation de enum appelé dans un fonction

Sujet résolu
    8 mars 2023 à 17:58:35

    Bonjour,

    J'ai de la difficulté à comprendre mon erreur... Je suis dans la construction d'un programme où je souhaite utiliser enum pour sélectionner des couleurs et renvoyer les infos de la couleur correspondante vers un autre fichier.

    Sur une seul page la combine fonctionne très bien puisque je ne fais appel à aucune fonction. J'ai tenté beaucoup de choses mais sans succès et je ne comprends pas pourquoi.

    Voici le code des 3 fichiers en question, peut-être m'aiderez-vous à trouver une solution ;-)

    main.c

    #include <stdio.h>
    
    #include "colors.h"
    
    
    int main(void)
    {   
        Color couleur;
        NC choix = BLEU;
    
        
        couleur = get_color(choix);
    
    
    
        printf("%d, %d, %d", couleur.r, couleur.g, couleur.b);
    
    
    
        return 0;
    }

    colors.h :

    #ifndef __COLORS_H__
    #define __COLORS_H__
    
    typedef enum NameColor
    {
        ROUGE,
        VERT,
        BLEU
    
    } NC;
    
    typedef struct Color {
    
        int r,g,b ;
    
    }Color;
    
    Color get_color(NC x);
    
    
    
    #endif


    et colors.c :

    #include <stdio.h>
    #include "colors.h"
    
    
    Color get_color(NC x)
    {
        Color c;
        Color red = {255, 0, 0};
        Color green = {0, 255, 0};
        Color blue = {0, 0, 255};
    
    
        switch (x)
        {
        case ROUGE:
            c = red;
            return c;
            break;
    
        case VERT:
            c = green;
            return c;
            break;
    
        case BLEU:
            c= blue;
            return c;
            break;
        
        default:
            break;
        }
    }


    retour du compilo :

    /usr/bin/ld : /tmp/ccGBXGeR.o : dans la fonction « main » :
    main.c:(.text+0x15) : référence indéfinie vers « get_color »
    collect2: error: ld returned 1 exit status

    d'avance merci ;-)

    • Partager sur Facebook
    • Partager sur Twitter
    On apprend tout le long de sa vie !
      8 mars 2023 à 18:19:02

      Hello,

      Le message est clair: le linker ne trouve pas le code compilé de get_color() (ld c'est le linker, l'éditeur de lien). As-tu bien indiqué que colors.c faisait partie de ton projet ?

      -
      Edité par edgarjacobs 8 mars 2023 à 18:21:07

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        8 mars 2023 à 19:31:05

        edgarjacobs a écrit:

        Hello,

        Le message est clair: le linker ne trouve pas le code compilé de get_color() (ld c'est le linker, l'éditeur de lien). As-tu bien indiqué que colors.c faisait partie de ton projet ?

        -
        Edité par edgarjacobs il y a environ 1 heure




        Quelle patate je suis lol... évidemment si je compile le main et pas les autres liens ça ne risque pas de fonctionner...

        Là je viens de faire *.c au lieu de main.c ça fonctionne.

        Merci de m'avoir aidé, je ne suis pas encore trop familier avec le langage mais ça vient petit à petit....
        Là je cherchais encore ce qu'il se passait...

        En passant j'ai une question : il y a moyen de désinitialiser la structure pour le passer en paramètre car ça me met un warning ?

        Comme solution j'ai déclaré plus haut un Color vide ={0, 0, 0};

        puis dans le default :

                             c = vide; return c;
        Ya moyen de faire plus court ou c'est bon comme ça ?





        -
        Edité par kalpwet 8 mars 2023 à 19:42:26

        • Partager sur Facebook
        • Partager sur Twitter
        On apprend tout le long de sa vie !
          8 mars 2023 à 20:07:35

          Re,-

          Ligne 7 dans get_color(), il suffit d'initialiser c (pas besoin de la variable vide):

          Color c={0};

          Tous le membres de c sont mis à zéro. Mais attention, il faut comprendre le mécanisme

          typedef struct {
          	int a;
          	int b;
          	int c;
          } struct_t;
          
          
          struct_t s1={0};		// met tous les membres de s1 à 0
          struct_t s2={3};		// s2.a vaut 3, .b et .c sont mis à 0
          
          int array[5]={0};		// met les 5 cases de array à 0
          int array[5]={1};		// met array[0] à 1, les autres cases à 0
          int array[5]={1,0,3};		// met array[0] à 1, array[1] à 0, array[3] à 3, les suivantes à 0
          

          Pour initialiser les structure, on peut aussi écrire

          struct_t s3={.b=8, .a=2, .c=4};
          struct_t s4={.b=8};		// s4.b vaut 8, s4.a et .c sont mis à 0

          -
          Edité par edgarjacobs 8 mars 2023 à 20:09:27

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            9 mars 2023 à 8:17:07

            Pour établir une correspondance entre une énumération et des constantes, au lieu de faire un switch, il est largement préférable d'utiliser un tableau, indexé par l’énumération (laquelle définit des constantes entières, en gros, donc utilisables comme indices)

            Code

            #include <stdio.h>
            
            typedef enum color_name
            {
                RED,
                GREEN,
                BLUE
            } color_name ;
            
            typedef struct color {
            	int r, g, b;
            } color;
            
            const  color RED_COLOR =   {255, 0, 0};
            const  color GREEN_COLOR = {0, 255, 0};
            const  color BLUE_COLOR =  {0, 0, 255};
            
            
            color get_color(color_name name) {
            	
            	static const color predef_colors[] = {
            		[GREEN] = GREEN_COLOR,
            		[BLUE]  = BLUE_COLOR,
            		[RED]   = RED_COLOR
            	};
            
            	return predef_colors[name];
            }
            
            
            int main(void)
            {  
                color_name my_choice = BLUE;
                color my_color = get_color(my_choice);
            	printf("(%d, %d, %d)\n",
            		   my_color.r, my_color.g, my_color.b);
            
                return 0;
            }
            

            Commentaires

            • const permet de protéger les trucs qui ne doivent pas changer par accident. Les définitions des couleurs prédéfinies, par exemple
            • la correspondance nom/couleur, ça regarde seulement get_color. D'où le choix de définir predef_color dans la fonction. C'est un choix discutable.
            • on ne va pas recréer le tableau des couleurs prédéfinies à chaque entrée dans get_color, donc on le déclare static.  Il ne va pas changer, donc il est const.
            • alternative : le sortir de la fonction, mais toujours avec static pour que son nom ne soit pas visible par le linker (si on n'a pas de raison de l'exporter)
            • noter que pour l'initialisation du tableau, je peux me permettre 1) de ne pas déclarer sa taille qui correspondra à  1+la plus grande valeur de l'énumération   et 2) de fournir les éléments dans le désordre.

            -
            Edité par michelbillaud 9 mars 2023 à 8:20:41

            • Partager sur Facebook
            • Partager sur Twitter
              9 mars 2023 à 17:49:21

              Merci pour ces précieuses informations.

              Je connaissais les initialisation des tableaux ainsi que leurs modifications.

              En revanche pour les structures je te remercie des précisions, faut que je m'exerce également avec les structures de tableaux ;-)

              L'apprentissage de ce langage est un vrai plaisir ;-)

              /*---------------------------------------------------------------------------------*/

              Et merci Michel pour la proposition d'utiliser les tableaux avec les structures, ainsi que static et const.

              Étant débutant dans le langage je n'ai pas forcément connaissance des "bonnes pratiques" et je trouve fabuleux de voir des passionnés orienter les novices en donnant des infos de qualité, lesquelles je vais reprendre dans mon code d'ailleurs car j'y vois beaucoup d'avantages.

              Je comptais justement m'exercer à utiliser les tableaux avec les structures (c'est comme si tu t'étais un instant retrouvé dans mes pensées hahahahaha), c'est donc une bonne entrée en matière :-) .

              Un tout grand merci !

              -
              Edité par kalpwet 9 mars 2023 à 18:11:29

              • Partager sur Facebook
              • Partager sur Twitter
              On apprend tout le long de sa vie !

              Utilisation de enum appelé dans un fonction

              × 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