Partage
  • Partager sur Facebook
  • Partager sur Twitter

error: unknown type name ...

    16 septembre 2021 à 17:29:34

    Salut !

      La compilation de ces quelques lignes a échoué et le debugger indique comme erreur error: unknown type name ...

    Une idée sur comment fixer le problème ? 

    #include <stdio.h>
    #include <stdlib.h>
    void initialisation (coordonnees *pointeur);
    
    
    int main()
    {
        typedef struct coordonnees coordonnees;
    
        struct coordonnees
        {
            int x;
            int y;
        };
    
        coordonnees point;
    
        point.x = 10, point.y=45;
    
        printf ("%d, %d", point.x, point.y);
    
        initialisation(&point);
    
        printf ("%d, %d", point.x, point.y);
        return 0;
    }
    
    
    void initialisation (coordonnees *pointeur)
    {
    
        (*pointeur).x = 0;
        (*pointeur).y=0;
    
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2021 à 17:48:22

      Le compilateur lit le code de haut en bas quand il arrive à la ligne 3, il ne connait pas encore le type coordonnees.

      Il faut donc mettre tout ça dans le bon ordre !

      PS : tu peux utiliser l'opérateur -> pour accéder aux champs d'une structure depuis un pointeur :

          pointeur->x = 0;

      C'est plus lisible.

      -
      Edité par rouIoude 16 septembre 2021 à 17:51:27

      • Partager sur Facebook
      • Partager sur Twitter
        17 septembre 2021 à 12:41:32

        #include <stdio.h>
        #include <stdlib.h>
        
        typedef struct coordonnees coordonnees;
        
            struct coordonnees
            {
                int x;
                int y;
            };
        
        void initialisation (coordonnees *pointeur)
        {
        
            pointeur->x = 0;
            pointeur->y=0;
        
        }
        
        
        int main()
        {
            coordonnees point;
        
            point.x = 10, point.y=45;
        
            printf ("%d, %d\n", point.x, point.y);
        
            initialisation(&point);
        
            printf ("%d, %d", point.x, point.y);
            return 0;
        }
        
        
        
          J'ai sorti 
        typedef struct coordonnees coordonnees;
        
            struct coordonnees
            {
                int x;
                int y;
            };
         de la fonction main et ça fonctionne, pas d'autres moyens non?

        -
        Edité par Lounes ^^ 17 septembre 2021 à 12:42:58

        • Partager sur Facebook
        • Partager sur Twitter
          17 septembre 2021 à 13:02:06

          C'est précisément ce qu'il fallait faire.

          Donc pas besoin de chercher d'autres moyens.

          • Partager sur Facebook
          • Partager sur Twitter
            17 septembre 2021 à 13:28:52

            Lounes ^^ a écrit:

             J'ai sorti ... de la fonction main et ça fonctionne, pas d'autres moyens non?

            Un principe important de la programmation est l'encapsulation. Il important de limiter la quantité de choses visibles pour empêcher les mauvaises utilisation. En particulier, tout ce qui est défini ou déclaré à l'intérieur une fonction n'est visible que de la fonction. Donc coordonnees étant utilisé ailleurs doit être défini hors de la fonction main().
            Une seconde règle en C, c'est que tout se lit du début vers la fin. Donc si on veut utiliser une entité inconnue (ni définie, ni déclarée avant) il y aura erreur. coordonnees doit bien être définie avant sa première utilisation.

            Il faut donc faire comme tu l'as fait.

            2 commentaires:
            - c'est pour cette raison que l'on mets des #include de fichier d'entête. Ta définition de la structure coordonnees pourrait donc aussi être placée dans un fichier d'entête.
            - on pourrait voir un contre exemple dans ta première ligne. Elle déclare un alias de coordonnees vers ta struct coordonnees qui ne sera définie qu'après. En fait ça n'est pas un problème car elle fait 2 choses : déclare la struct coordonnees, et y fait référence. Mais sans la définition qui suit le reste du code ne fonctionnerait pas.
            - il est important de distinguer déclaration de définition. Par exemple, la déclaration d'un type est suffisante pour définir/déclarer un pointeur sur ce type, mais la définition est nécessaire pour l'utiliser. Par exemple, ta ligne 12 n'a pas besoin que de la déclaration (faite ligne 4) mais tes lignes 15, 16, 23, 25, 27, 31 nécessitent la déclaration de coordonnees et la définition de struct coordonnees (faites lignes 4 à 10).

            • Partager sur Facebook
            • Partager sur Twitter

            En recherche d'emploi.

            error: unknown type name ...

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown