我认为用纯 C 语言构建一个库来处理各种矩阵计算将是一个很好的挑战。现在,尽管我在 Objective-C 和 Cocoa 方面有一些很好的经验,但我对 C 的了解正是我所需要的与 Objective-C 一起工作,仅此而已。例如,我熟悉 C 语言中的指针、数组等概念,但不熟悉 malloc 和 free(ARC 是一种幸福!)。我决定接受这个项目,这样我可以获得更多的 C 经验(当然,除了享受这样做的乐趣之外!)。
到目前为止,我有一个如下定义的矩阵:
typedef float mReal;
typedef struct {
mReal **v;
int w;
int h;
} matrix;
当然,我还需要一种方法来获得一个具有我想要的大小的全新矩阵:
void new_matrix(matrix *m, int w, int h) {
m = malloc(sizeof(matrix));
m->w = w;
m->h = h;
m->v = malloc(w * sizeof *(m->v));
for (int i = 0; i < w; i++) {
m->v[i] = malloc(h * sizeof *(m->v[i]));
}
}
On my main()
函数之后,我决定尝试一下我的新方法:
int main()
{
matrix m;
new_matrix(&m, 5, 5);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
m.v[i][j] = i*j;
}
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%f", m.v[i][j]);
}
}
}
现在,您可能已经通过查看代码(或没有)猜到了这一点,但是当我尝试将某些内容写入矩阵时,这会崩溃,更具体地说,在这一行:
m.v[i][j] = i*j;
在我试图理解这个问题的失败尝试中,我将前两个嵌套 for 循环从main()
to new_matrix()
,并在 malloc 之后直接写入。这奏效了。所以我想问题一定是因为矩阵在一个函数中被分配并在另一个函数中被更改?