【问题标题】:expected ‘struct matrix_t *’ but argument is of type ‘struct matrix_t *’ ?_? no difference预期为“struct matrix_t *”,但参数的类型为“struct matrix_t *”?_?没有不同
【发布时间】:2012-04-08 11:17:38
【问题描述】:
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);

我真的不明白这些错误信息。请帮帮我:)

【问题讨论】:

    标签: c pointers types struct


    【解决方案1】:

    啊哈,您没有struct matrix_t,但next 字段是使用结构标记声明的。每当使用 next 字段时,这都会导致问题。

    matrix_t 可以既是结构标记又是类型名称,因为它们位于不同的命名空间中,但实际上,您的定义以...开头。

    struct {
    

    不是……

    struct matrix_t {
    

    换句话说,你有一个 unnamed 结构,它有一个名为 matrix_t 的 typedef,但你从未真正定义过 struct matrix_t.

    【讨论】:

      【解决方案2】:

      你的类型定义应该是

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

      否则,matrix_t 类型指的是完整但未命名的结构类型,而 struct matrix_t 指的是您从未定义的不同的、已命名但不完整的结构类型。

      【讨论】:

      • 现在很清楚了 :) 感谢您的快速回答,没有任何警告了!
      【解决方案3】:

      将您的 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 指的是不同的、不完整的类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多