如何在ansi c中定义typedef矩阵

时间:2015-04-11 15:25:22

标签: c multidimensional-array typedef

我有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,然后将其用作多维数组?

谢谢。

2 个答案:

答案 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()会更有效。