C typedef:指向结构的指针

C typedef:指向结构的指针,c,typedef,C,Typedef,为了我的个人娱乐,我正在学习C。我正在尝试编写一个矩阵计算头。我有一个显示矩阵的函数,rmat_show(rmatrix*r),它应该打印整个矩阵。然而,我的数据类型rmatrix似乎没有很好地传递给这个函数 格式h: // Matrix struct, m x n matrix. Pointer *value points to the contents. struct srmatrix { int m,n; float *value; }; typedef struct s

为了我的个人娱乐,我正在学习C。我正在尝试编写一个矩阵计算头。我有一个显示矩阵的函数,rmat_show(rmatrix*r),它应该打印整个矩阵。然而,我的数据类型rmatrix似乎没有很好地传递给这个函数

格式h:

// Matrix struct, m x n matrix. Pointer *value points to the contents.
struct srmatrix {
    int m,n;
    float *value;
};

typedef struct srmatrix rmatrix;

// Show the matrix
void rmat_show(rmatrix* r) {
    int i, j;
    printf("\nshow\n");
    printf("[%dx%d]\n",r->m,r->n);
    for (i = 0; i < r->m; i++) {
        for (j = 0; j < r->m; j++) {
            printf("%d\t",value[(j-1)*r->m+i-1]);
        }
        printf("\n");
    }
}
#ifndef RMAT_H
#define RMAT_H

typedef struct rmatrix_s {
  size_t m, n; /* There is no need to define dimension as signed. */
  float * value;
} rmatrix_t;

void rmat_show(rmatrix_t * r);

#endif
在rmat_show之后,我试图用另一个函数杀死te矩阵。它会产生相同的错误,即:“rmat_show”的参数1的不兼容类型应为“rmatrix”,但参数的类型为“struct rmatrix*”。我尝试过搜索“指向typedef的指针”和类似的术语,但没有结果。我相信typedef声明没有被带入函数defention。我在Windows7上使用msys和mingw

谢谢你的帮助


编辑:添加了我错误复制的typedef行。

似乎您使用了相同的循环变量两次

 for (i = 0; i < r->m; i++) {
    for (i = 0; i < r->m; i++)
但是

是否包含struct取决于编译器的C/C++

版本

struct srmatrix {
  int m,n;
  float *value;
};

... 

void rmat_show(rmatrix* r) 
{ 
  ...

  for (i = 0; i < r->m; i++) 
  {
    for (i = 0; i < r->m; i++) 
    {
      printf("%d\t", value[(n-1)*r->m+m-1]);
    }

    printf("\n");
  }

  ...
格式c:

...
#include "rmat.h"

void rmat_show(rmatrix_t * r) 
{ 
  ...

  for (size_t j = 0; j < r->n; j++) 
  {
    for (size_t i = 0; i < r->m; i++) 
    {
      printf("%d\t", value[j*r->m + i]);
    }

    printf("\n");
  }
要编译此文件,请执行以下操作:

gcc -g -Wall -Wextra -o main main.c rmat.c

我甚至没有在你发布的代码中看到任何typedef。不要将代码(即函数)放在头文件中。只有函数原型、结构、typedef等进入头文件。请参阅,以了解正确的方法。我添加了typedef行,这是复制时遗漏的。代码中还有一个bug,在一个未使用的函数中。应该注释掉它。这是正确的,但它不会解决编译器错误。(我不怪你,因为目前还不知道编译器错误的确切原因;只需说“.”)很抱歉再次打扰你,但你所说的“是否包含struct取决于你的编译器版本”是什么意思?这是错误的。你把这个行为和C++的混淆了。我改变了StULTE和for循环的代码来匹配这个,但是我仍然得到同样的错误,函数希望RMART,变量是StReTrMatL*(这很奇怪,因为它应该是SrimeSrMatr*)。@犀牛256:根据我的修改,只需使用
rmatrix\u t*r
。我更新了我的代码,使这一点变得显而易见。@Rhinoceros256:如果你喜欢这个答案,你可以自由地投票。
struct srmatrix {
  int m,n;
  float *value;
};

... 

void rmat_show(rmatrix* r) 
{ 
  ...

  for (i = 0; i < r->m; i++) 
  {
    for (i = 0; i < r->m; i++) 
    {
      printf("%d\t", value[(n-1)*r->m+m-1]);
    }

    printf("\n");
  }

  ...
#ifndef RMAT_H
#define RMAT_H

typedef struct rmatrix_s {
  size_t m, n; /* There is no need to define dimension as signed. */
  float * value;
} rmatrix_t;

void rmat_show(rmatrix_t * r);

#endif
...
#include "rmat.h"

void rmat_show(rmatrix_t * r) 
{ 
  ...

  for (size_t j = 0; j < r->n; j++) 
  {
    for (size_t i = 0; i < r->m; i++) 
    {
      printf("%d\t", value[j*r->m + i]);
    }

    printf("\n");
  }
...
#include "rmat.h"

int main(int argc, char **argv)
{
  ...
  rmatrix_t * r = malloc(sizeof(*r));
  ...
gcc -g -Wall -Wextra -o main main.c rmat.c