我有这个数据结构
struct m_bucket
{
int a;
int b;
};
然后我需要使用struct m_bucket
的二维数组作为矩阵,所以我以这种方式声明它
typedef struct m_bucket ** matrix_t;
这是初始化函数
matrix_t matrix_alloc( int n_rows , int n_cols )
{
matrix_t m;
int i;
m = ( struct m_bucket **) malloc( ((n_rows + 1) * sizeof( struct m_bucket * )));
for(i=0 ; i < (n_rows + 1) ; i++ )
{
m[i] = ( struct m_bucket *) malloc( ((n_cols + 1) * sizeof( struct m_bucket )));
}
return m;
}
我的问题是,在通过引用函数传递数据结构时,我对访问此数据结构的正确方法感到有些困惑。 我试过了,但它没有用。
void matrix_set_column(matrix_t * matrix , int val , int col , int n_cols)
{
int i;
for(i = 0 ; i < (n_cols + 1) ; i++)
{
(*matrix)[col][i].cost = val;
if (val>0)
((*matrix)[col][i]).a = 4;
else
((*matrix)[col][i]).a = -1;
val++;
}
}
访问此结构的正确方法是什么?
答案 0 :(得分:1)
由于分配matrix_t
的代码使用第一个n_rows
的行数malloc
,因此使用矩阵的代码需要按row
的顺序传递索引,然后column
。您的函数需要反转其索引,如下所示:
// Assuming that col represents the column, not the row,
// i represents the row, so it needs to go first
((*matrix)[i][col]).a = 4;
索引i
也需要从零到n_rows+1
。
除此之外,您的代码还可以:您已正确添加括号以强制一元*
在[]
运算符之前完成,因此其余代码都可以。
答案 1 :(得分:1)
您可能需要以下内容:
void matrix_set_column(matrix_t matrix , int val , int col , int n_cols)
{
int i;
for(i = 0 ; i < (n_cols + 1) ; i++)
{
matrix[col][i].cost = val;
if (val>0)
matrix[col][i].a = 4;
else
matrix[col][i].a = -1;
val++;
}
}
并将其用作:
...
matrix_t m;
m = matrix_alloc(10,20);
matrix_set_column(m, 123, 9, 20);
...
这将仅传递指针,因为matrix_t
是指针类型。