我有2个.c文件,adj.c和main.c. 我尝试做的是在adj.c
定义#define N 12
typedef int adj_mat[N]
并在main.c中使用此typedef作为二维数组 我试着像这样定义,
adj_mat mat[N];
我的程序中有一个函数,用零填充此矩阵,定义为:
void fill_mat_zero(adj_mat);
我的问题是,如果我用Visual Studio运行这个程序没有问题, 但如果我尝试在Ubuntu中编译它,它会显示一个错误,如下所示: 注意:预期'int '但参数的类型为'int()[12]'
这是什么问题? typedef的定义是不正确的? 有没有办法将adn_mat [N]数组定义为typedef,然后将其用作多维数组?
谢谢。答案 0 :(得分:1)
此
#define N 12
typedef int adj_mat[N]
将adj_mat
定义为类型为int
的12元素数组。
这个
adj_mat mat[N];
将mat
定义为类型为adj_mat
的12元素数组,这意味着mat
实际上是int[12][12]
。所以你得到了错误。
和
void fill_mat_zero(adj_mat);
是声明,而不是定义。定义有一个代码体。当你进入一个国家时,想一个声明就像海关申报一样 - 你声明你有什么东西,但声明实际上不是那个东西。< / p>
答案 1 :(得分:1)
从问题中不清楚你是否想要一个你会索引的一维数组,就像它是一个二维,例如
adj_mat[3*row + col]
在这种情况下,您的声明只是部分制作。这个编译干净,我从你的声明中删除了[N]
并在函数参数中添加了一个标识符。
#define N 12
typedef int adj_mat[N];
void fill_mat_zero(adj_mat m) {
int i;
for (i=0; i<N; i++)
m[i] = 0;
}
int main(void){
adj_mat mat;
fill_mat_zero(mat);
return 0;
}
或者你想通过数组adj_mat[]
来使它成为2-D。
#define N 12
typedef int adj_mat[N];
void fill_mat_zero(adj_mat *m, int size) {
int i, j;
for (i=0; i<N; i++)
for (j=0; j<size; j++)
m[i][j] = 0;
}
int main(void){
adj_mat mat[N];
fill_mat_zero(mat, N);
return 0;
}
但是,如果您想使用0
填充数组,则使用memset()
会更有效。