ожидается «struct matrix_t *», но аргумент имеет тип «struct matrix_t *»? _?нет разницы - PullRequest
4 голосов
/ 24 марта 2012
main.c:78:25: erreur: assignment from incompatible pointer type [-Werror]
main.c:81:9: erreur: passing argument 2 of ‘matrix_multiply’ from incompatible pointer type [-Werror]
main.c:6:11: note: expected ‘struct matrix_t *’ but argument is of type ‘struct matrix_t *’

строка 6 - это функция matrix_multiply

вот мой код, который начинается со строки 74

matrix_t *m;
matrix_t *first = matrix_reader_next(reader);
matrix_t *previous = first;
while ( (m = matrix_reader_next(reader))) {
    previous->next = m;
    previous = m;
}
matrix_t *result = matrix_multiply(first,first->next);

и вот мои прототипы функций и структура

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

matrix_t* matrix_multiply(matrix_t* first, matrix_t*second);
matrix_t* matrix_reader_next(matrix_reader_t *r);

Я действительно не понимаю эти сообщения об ошибках.Пожалуйста, помогите мне:)

Ответы [ 3 ]

7 голосов
/ 24 марта 2012

Ваше определение типа должно читаться как

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

В противном случае тип matrix_t относится к полному, но неназванному типу структуры, тогда как struct matrix_t относится к другому, именованному, но неполному типу структуры, который вы никогда не определяете.

7 голосов
/ 24 марта 2012

Измените ваше struct определение на это:

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

Заметили разницу?

struct matrix_t не совпадает с typedef ... matrix_t; они существуют в разных пространствах имен; поэтому в вашей версии кода компилятор предполагает, что struct matrix_t *next относится к другому, неполному типу.

3 голосов
/ 24 марта 2012

Ага, у вас нет struct matrix_t, но поле next объявлено с использованием тега struct.В этом случае возникают проблемы при использовании поля next.

matrix_t может быть и тегом структуры, и именем типа, так как они находятся в разных пространствах имен, но как есть, ваше определение начинается с ...

struct {

not ...

struct matrix_t {

Другими словами, у вас есть безымянная структура, которая имеет typedef с именем typedefmatrix_t но вы на самом деле никогда не определяете struct matrix_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...