attendu ‘struct masortingx_t *’ mais l’argument est de type ‘struct masortingx_t *’? _? aucune différence

main.c:78:25: erreur: assignment from incompatible pointer type [-Werror] main.c:81:9: erreur: passing argument 2 of 'masortingx_multiply' from incompatible pointer type [-Werror] main.c:6:11: note: expected 'struct masortingx_t *' but argument is of type 'struct masortingx_t *' 

la ligne 6 est la fonction masortingx_multiply

voici mon code qui commence à la ligne 74

 masortingx_t *m; masortingx_t *first = masortingx_reader_next(reader); masortingx_t *previous = first; while ( (m = masortingx_reader_next(reader))) { previous->next = m; previous = m; } masortingx_t *result = masortingx_multiply(first,first->next); 

et voici mes prototypes de fonction et la structure

 typedef struct { int **M; int nLi; int nCo; struct masortingx_t *next; } masortingx_t; masortingx_t* masortingx_multiply(masortingx_t* first, masortingx_t*second); masortingx_t* masortingx_reader_next(masortingx_reader_t *r); 

Je ne comprends vraiment pas ces messages d’erreur. Aidez-moi, s’il vous plaît 🙂

Votre définition de type devrait se lire

 typedef struct masortingx_t { int **M; int nLi; int nCo; struct masortingx_t *next; } masortingx_t; 

Sinon, le type masortingx_t fait référence à un type de structure complet mais non nommé, tandis que struct masortingx_t fait référence à un type de structure différent, nommé mais incomplet, que vous ne définissez jamais.

Changez votre définition de struct en ceci:

 typedef struct masortingx_t { int **M; int nLi; int nCo; struct masortingx_t *next; } masortingx_t; 

Remarquez la différence?

struct masortingx_t n’est pas la même chose que typedef ... masortingx_t ; ils existent dans différents espaces de noms; Ainsi, dans votre version du code, le compilateur suppose que struct masortingx_t *next fait référence à un type différent, incomplet.

Aha, vous n’avez pas encore de struct masortingx_t , le champ next est déclaré à l’aide d’une balise struct. Cela pose alors des problèmes chaque fois que le champ next est utilisé.

masortingx_t pourrait être à la fois une balise struct et un nom de type, comme ils se trouvent dans des espaces de noms différents, mais telle quelle, votre définition commence par …

 struct { 

ne pas…

 struct masortingx_t { 

En d’autres termes, vous avez une structure non nommée qui a une typedef appelée masortingx_t mais vous ne définissez jamais réellement une struct masortingx_t.