【发布时间】:2021-09-13 16:06:59
【问题描述】:
我想创建一个struct,它可以有一个矩阵和一些参数;所以,例如,我有:
struct matrix {
int rows;
int cols;
double** data;
} A;
我想使用A[x][y] = A.data[x][y] 之类的轻松访问,而不是A.data[x][y]。有什么想法吗?
【问题讨论】:
我想创建一个struct,它可以有一个矩阵和一些参数;所以,例如,我有:
struct matrix {
int rows;
int cols;
double** data;
} A;
我想使用A[x][y] = A.data[x][y] 之类的轻松访问,而不是A.data[x][y]。有什么想法吗?
【问题讨论】:
这是可行的,虽然有点棘手。
您可以使用类似于Simple Dynamic Strings 中使用的技术。只需将元数据放在实际矩阵数据之前。
像这样定义你的结构:
struct matrix {
int rows, cols;
double *data[];
};
将其分配为具有灵活成员的典型结构。
malloc(sizeof(struct matrix) + rows * sizeof(double*))
现在转折。
不是从matrix_create()返回struct matrix的指针,而是返回matrix.data,指向成员的指针。
double **create_matrix(int rows, int cols) {
struct matrix *m = malloc( ... );
... Allocation of rows
return m->data;
}
这样你就可以使用漂亮的A[i][j] 表示法。
接下来添加一个宏,以与container_of 类似的方式将此指向成员的指针转换回struct matrix。
示例实现。
#define to_matrix(ptr) (struct matrix*)((char*)ptr - offsetof(struct matrix, data))
现在你可以像这样实现matrix_get_rows():
int matrix_get_rows(double **A) {
struct matrix *m = to_matrix(A);
return m->rows;
}
您可以以类似的方式实现类似的帮助器和析构器。
典型的用法可能是:
int main() {
double **A = matrix_create(1,1);
A[0][0] = 42;
printf("%d %d\n", matrix_get_rows(A), matrix_get_cols(B));
// should print "1 1"
matrix_release(A);
return 0;
}
【讨论】:
我想制作的不是 A.data[x][y] ,而是 A[x][y] = A.data[x][y] 以便于访问。有什么想法吗?
结构的成员只能通过成员选择运算符 (.) 通过该结构访问。它们只能通过间接成员选择运算符 (->) 通过指向结构的指针进行访问。 C 没有运算符重载,因此A[x][y] 形式不是替代方案。
您可以创建一个函数或宏来隐藏data 成员的参与,但我个人认为这不会更好或更清晰。
【讨论】: