Pointeur : incomplet non autorisé

Bonjour, j'ai le code suivant:
#include <stdio.h>


void main(){

 printf("bonjour");

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

 Coordonnees point = { 0,0 };
 
 Coordonnees *pointP = NULL;
 printf("\n\n\n");
}


typedef struct Coordonnees Coordonnees;
void initCoord(Coordonnees* point) {

 point->x = 0;
 point->y = 0;

}


j'ai l'erreur suivante:
type incomplet non autorisé
à 3 endroits différents:
- ligne 15
- ligne 25
- ligne 26
où il est écrit "point".

J'ai beau chercher, je ne vois pas d'où pourrait venir l'erreur.
Auriez-vous une explication ?

Merci

Configuration: Windows / Firefox 85.0

2 réponses

  1. Bonsoir ,

    Erreur déclaration structure
    typedef struct inscrit Inscrit;
     
    struct Inscrit {
     
        int numMatriJ1;
     
        int numMatriJ2;
     
        int catégorie;
     
        Inscrit *pSuiv;
     
     
    };
    0
    1. Hello,
      voici les erreurs :
       gcc -Wall -Wextra -c str2.c
      str2.c:4:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
       void main(){
            ^~~~
      str2.c: In function ‘main’:
      str2.c:17:15: warning: unused variable ‘pointP’ [-Wunused-variable]
        Coordonnees *pointP = NULL;
                     ^~~~~~
      str2.c:15:14: warning: unused variable ‘point’ [-Wunused-variable]
        Coordonnees point = { 0,0 };
                    ^~~~~
      str2.c: In function ‘initCoord’:
      str2.c:25:7: error: dereferencing pointer to incomplete type ‘Coordonnees’ {aka ‘struct Coordonnees’}
        point->x = 0;
             ^~
      


      Au début, la structure et le typedf sont reconnus. Il n'y a que des warnings sur des variables non utilisées.
      Le problème vient du fait que la déclaration de la structure ainsi que le typedef sont fait à l'intérieur de la fonction main ! du coup leur visibilité est limité à cette fonction.

      Avant la définition de la fonction initCoord, tu fais un typedef sur une struct qui n'existe pas à cet endroit. Tu peux en faire un pointeur, mais tu ne pourras pas le déréférencer.

      De plus le prototype de main est :
      int main(void)
      {
      
          ....
      
          return 0;
      }
      0