Pointeur : incomplet non autorisé

truite -  
wytekrow Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -
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

Pat
 
Bonsoir ,

Erreur déclaration structure
typedef struct inscrit Inscrit;
 
struct Inscrit {
 
    int numMatriJ1;
 
    int numMatriJ2;
 
    int catégorie;
 
    Inscrit *pSuiv;
 
 
};
0
wytekrow Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   2
 
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