Partage
  • Partager sur Facebook
  • Partager sur Twitter

façon d'écrire un typedef de structure

Sujet résolu
    16 septembre 2019 à 0:58:56

    bonjour a tous, dans le cours de language C, à cet endroit, je trouve celà :

    typedef struct Coordonnees Coordonnees;
    struct Coordonnees
    {
        int x;
        int y;
    };

    je n'arrive pas à faire fonctionner ce code.

    apprés quelque recherche, j'ai trouvé une autre maniére d'ecrire un tel typedef:

    typedef struct 
    {
        int x;
        int y;
    }Coordonees;

    ce code faire exactement la méme chose et est plus condensé, même plus claire, mais je ne comprend pas pourquoi le cours explique une façon de faire plus longue qui ne fonctionne apparemment pas?

    je trouve aussi bête de faire des typedef tout sa pour ne pas ecrire le mot struct... on perd en clarté dans le code non? mais bon... si tout le monde fait comme ça je devrai m'y habituer tempis

    la façon de faire du cours est-elle censé fonctionner? 

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2019 à 7:01:41

      C'est en effet une mauvaise idée de coller des typedef à tout bout de champ.

      C'est utile quand on veut, dans une bibliothèque, présenter une API où un  type est relativement opaque, c'est à dire par exemple le programmeur d'application n'a pas besoin de savoir si les Événements qu'il manipule sont des structures, des unions ou des pointeurs  parce qu'il les manipule à travers des fonctions.

      C'est utile pour déclarer des types compliqués, comme "fonction qui prend un tableau et retourne une structure"

      Pour le reste, c'est plutôt nuisible. 

      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2019 à 10:47:30

        cobra7476 a écrit:

        la façon de faire du cours est-elle censé fonctionner? 

        Oui, si ça ne fonctionne pas chez toi, c'est qu'il doit y avoir une erreur ailleurs dans ton code.
        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2019 à 11:18:09

          Salut,

          La principale différence que j'ai notée sur ces 2 syntaxes se trouve au niveau de l'IDE. Pour C::B au moins, la première syntaxe permet de retrouver le type par son nom dans la liste des typedef, sans quoi les structures sont simplement numérotées de manière incrémentale.

          Salutations.

          • Partager sur Facebook
          • Partager sur Twitter

          Bonhomme !! | Jeu de plateforme : Prototype.

            16 septembre 2019 à 16:13:22

            Question de goût donc choisis le style qui te plaît le plus. Pour ma part je préfère le typedef direct car ça peut s'appliquer avec les fonctions et les enum aussi ce qui rend le style assez homogène :

            typedef enum Color {
                red,
                green,
                blue
            } Color;
            
            typedef struct Point {
                int x;
                int y;
            } Point;
            
            typedef union Event {
                ClickEvent click;
                KeyEvent key;
            };
            
            typedef void (*OnClick)(const Event *);

            -
            Edité par markand 16 septembre 2019 à 16:15:39

            • Partager sur Facebook
            • Partager sur Twitter

            git is great because Linus did it, mercurial is better because he didn't.

              17 septembre 2019 à 19:24:09

              bonjour a tous et merci pour vos réponses

              bon et bien je viens de résoudre mon problème, il y avais en effet un problème tout autre. le fait de prendre de la distance sur son code fait souvent du bien :

              il s'agissais simplement du fait que main.h ne faisais pas partit de mon projet selon mon IDE.. or, la structure se trouvais dans le main.h, inclu par un #include je suppose donc que le #include ne suffit pas pour que la compilation fonctionne correctement, l'ide doit aussi "connaitre" les fichier (code::block)

              sujet donc résolu

              -
              Edité par cobra7476 17 septembre 2019 à 19:25:17

              • Partager sur Facebook
              • Partager sur Twitter
                17 septembre 2019 à 23:52:15

                Les fichiers entête ne doivent pas nécessairement faire partie du projet pour que la compilation fonctionne. Le problème devait venir d'ailleurs !
                • Partager sur Facebook
                • Partager sur Twitter
                  18 septembre 2019 à 0:36:15

                  alors j'ai résolu le problème sans m'en rendre compte :/
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 septembre 2019 à 1:27:57

                    cobra7476 a écrit:

                    bonjour a tous, dans le cours de language C, à cet endroit, je trouve celà :

                    typedef struct Coordonnees Coordonnees;
                    struct Coordonnees
                    {
                        int x;
                        int y;
                    };

                    apprés quelque recherche, j'ai trouvé une autre maniére d'ecrire un tel typedef:

                    typedef struct 
                    {
                        int x;
                        int y;
                    }Coordonees;

                    ce code faire exactement la méme chose et est plus condensé

                    Il ne fait pas tout à fait la même chose. Le premier code déclare struct Coordonnees et Coordonnees. Le second déclare seulement Coordonnees.

                    -
                    Edité par Marc Mongenet 19 septembre 2019 à 1:28:11

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 septembre 2019 à 9:11:26

                      Troisième façon :

                      typedef struct Coordonnees
                      {
                          int x;
                          int y;
                      } Coordonnees;

                      Dans le Kernighan et Ritchie, autre exemple, avec des noms différents

                      typedef struct tnode {
                       ....
                      } Treenode;
                       

                      Je trouve que ça contrevient au principe "évitez de multiplier les noms différents pour parler de la même chose" (*), mais d'un autre côté, est-ce vraiment la même chose ?

                      (*) Le K&R a bien des mérites, mais pas l'ambition d'être un manuel de bonne programmation :-)



                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 septembre 2019 à 11:09:22

                        michelbillaud a écrit:

                        (*) Le K&R a bien des mérites, mais pas l'ambition d'être un manuel de bonne programmation :-)

                        A l'époque de la première édition de "the C programming language", la commande 
                        typedef struct Coordonnees
                        {
                            int x;
                            int y;
                        } Coordonnees;

                        était interdite (car justement on a deux objets différents qui portent le même nom.) D'où le code proposé par le K&R.

                        Je pense que c'est la sortie du C++ qui a amené le langage C à évoluer et à tolérer d'avoir un nom en double dans le même espace de noms.
                        Ainsi on peut écrire une séquence à la fois valide en C et en C++.


                        • Partager sur Facebook
                        • Partager sur Twitter

                        En recherche d'emploi.

                          20 septembre 2019 à 2:14:23

                          Dalfab a écrit:

                          michelbillaud a écrit:

                          (*) Le K&R a bien des mérites, mais pas l'ambition d'être un manuel de bonne programmation :-)

                          A l'époque de la première édition de "the C programming language", la commande 

                          typedef struct Coordonnees
                          {
                              int x;
                              int y;
                          } Coordonnees;

                          était interdite (car justement on a deux objets différents qui portent le même nom.) D'où le code proposé par le K&R.

                          Je pense que c'est la sortie du C++ qui a amené le langage C à évoluer et à tolérer d'avoir un nom en double dans le même espace de noms.
                          Ainsi on peut écrire une séquence à la fois valide en C et en C++.

                          Merci pour l'information sur l'évolution depuis le K&R C, ça m'avait échappé.

                          Je ne comprend pas ce que tu veux dire par "voir un nom en double dans le même espace de noms". L'évolution depuis K&R C a justement consisté à mettre les tags dans un namespace distinct des identificateurs de variables, fonctions, typedef et enum. Il n'y a pas de tolérance pour des noms en double dans le même namespace.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          façon d'écrire un typedef de structure

                          × 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