我是C的新手。我正在尝试为练习编写一个非常基本的矩阵程序。
矩阵的工作方式是使用给定数量的行和列创建它,然后它会调用一个具有足够插槽的单个一维数组(行* cols插槽......你明白了)。然后,要访问一个插槽,您可以使用单元格在矩阵上调用matrix_getcell
,然后返回指向该单元格的指针。
这是matrix.h:
#ifndef MATRIX_H
#define MATRIX_H
#include <stdlib.h>
#include <stdio.h>
typedef unsigned int uint;
typedef struct matrix matrix;
struct matrix {
uint rows;
uint cols;
double *data;
};
matrix *matrix_new(uint rows, uint cols) {
matrix *n = malloc(sizeof(matrix));
if (n == NULL) exit(1);
n->data = calloc(rows * cols, sizeof(*(n->data)));
if (n->data == NULL) exit(1);
n->rows = rows;
n->cols = cols;
return n;
}
void matrix_del(matrix *m) {
if (m == NULL) return;
free(m->data);
free(m);
}
double *matrix_getcell(matrix *m, uint row, uint col) {
if (row >= m->rows) {
fprintf(stderr, "Invalid row: %d\n", row);
exit(1);
}
if (col >= m->cols) {
fprintf(stderr, "Invalid col: %d\n", col);
exit(1);
}
uint pos = (m->rows * row) + col;
return &(m->data[pos]);
}
#endif
这是main.c:
#include <stdio.h>
#include "matrix.h"
int main(int argc, char **argv) {
matrix *m = matrix_new(3, 3);
/* I know that a 3x3 will have 9 cells, so
* fill them up with successive numbers
*/
for (int i = 0; i < 9; i++) {
m->data[i] = i;
}
/* Now, run through each cell, row by column
* and print out the coords and the contents.
*/
for (uint r = 0; r < 3; r++) {
for (uint c = 0; c < 3; c++) {
double *cur = matrix_getcell(m, r, c);
printf("(%d, %d): %.3d\n", r, c, *cur);
}
}
matrix_del(m);
return 0;
}
我试图用这个方法将每个单独的单元格初始化为一个连续的数字,这样当我第二次将它循环到它时,它有望超过它:
(0, 0): 0
(0, 1): 1
(0, 2): 2
(1, 0): 3
(1, 1): 4
(1, 2): 5
(2, 0): 6
(2, 1): 7
(2, 2): 8
但相反,它会输出
(0, 0): 0
(0, 1): 0
(0, 2): 0
(1, 0): 1
(1, 1): 1
(1, 2): 1
(2, 0): 2
(2, 1): 2
(2, 2): 2
我已添加(然后删除)代码以测试matric_getcell
是否返回了错误的结果(似乎不是)。我已经改变了数据类型,我尝试过铸造......我不知道还有什么可以尝试。
为什么似乎将每列设置为相同的数字?
答案 0 :(得分:1)
当你计算单元格的位置时,你matrix_getcell
方法有一个错误。
double *matrix_getcell(matrix *m, uint row, uint col) {
...
// Should be (m_cols * row) + col.
uint pos = (m->rows * row) + col;
return &(m->data[pos]);
}
当您打印双打时,还有另一个错误。您应该使用%f
代替%d
来打印双打。
// v--- "%d" is the problem here
printf("(%d, %d): %.3d\n", r, c, *cur);
答案 1 :(得分:0)
你需要
double **data;
//将data
视为二维矩阵
在matrix_new
中使用以下来分配矩阵
n->data = calloc(rows, sizeof(double*));
if (n->data == NULL) exit(1);
for(int i = 0;i<rows;i++) {
n->data[i] = calloc(cols, sizeof(double));
}
为避免内存泄漏,请使用
释放它void matrix_del(matrix *m) {
if (m == NULL) return;
uint r=m->rows;
uint c=m->cols;
for(int i = 0; i <r ; i++)
free(m->data[i]);
free(m);
}