预期为 'struct matrix_t *',但参数的类型为 'struct matrix_t *'?_?没有区别。

5
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 typestruct 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

将你的struct定义更改为以下内容:

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

注意它们的区别了吗?

struct matrix_ttypedef ... matrix_t不同,它们存在于不同的命名空间中。因此,在您的代码版本中,编译器假定struct matrix_t *next是指向另一种不完整类型的指针。


7
你的类型定义应该如下:

你的类型定义应该读作

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

否则,类型matrix_t指的是一个完整但无名称的结构类型,而struct matrix_t指的是另一种有名称但不完整的结构类型,你从未定义过它。

现在很清楚了 :) 谢谢您的快速回答,不再有警告了! - yakoudbz

3
啊哈,你还没有一个名为struct matrix_t的结构体,但是却使用了一个结构体标签声明了next字段。这将导致在使用next字段时出现问题。 matrix_t可能既是结构体标签又是类型名称,因为它们处于不同的命名空间中,但是目前你的定义的开头是...
struct {

not...

struct matrix_t {

换句话说,你有一个未命名的结构体,其中有一个称为matrix_t的typedef,但你实际上从未定义struct matrix_t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接