Pointeur : incomplet non autorisé

truite -  
 wytekrow -
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. Pat
     
    Bonsoir ,

    Erreur déclaration structure
    typedef struct inscrit Inscrit;
     
    struct Inscrit {
     
        int numMatriJ1;
     
        int numMatriJ2;
     
        int catégorie;
     
        Inscrit *pSuiv;
     
     
    };
    0
  2. wytekrow
     
    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