我有一个2D数组,表示如下定义的数独网格:
Scanning.objects.filter(product__user=u,product__active=True).distinct('product_id').order_by('product_id', 'datetime')
我通过遍历每个元素和打印的函数运行它,它工作正常(显示81个零)。但是,我将它交给另一个函数,该函数将文件中的网格读入此数组。这是它的样子(用一堆printf语句我用于调试省略)。
q1 = Scanning.objects.filter(product__user=u,product__active=True).values('product_id').distinct().annotate(x=Max('id'))
q2 = Scanning.objects.filter(id__in=[i["x"] for i in q1])
当函数运行时,它似乎读取了第一行的find,但当它到达第二行并尝试在sudoku [1] [0]中插入一个值时,我得到一个seg错误。这是我的printfs输出的结果:
int** sudoku = (int**)malloc(sizeof(int*) * 9);
for(i = 0; i < 9; i++)
sudoku[i] = (int*)malloc(sizeof(int) * 9);
这是我正在尝试阅读的文件:
void readSudokuFile(char* filename, int*** grid) {
FILE* file;
int i, j, curr;
file = fopen(filename, "r");
for(i = 0; i < 9; i++) {
for(j = 0; j < 9; j++) {
fscanf(file, "%d", &curr);
*grid[i][j] = curr;
}
}
fclose(file);
}
我正在使用带-Wall和-pedantic的gcc编译,并且没有收到编译器警告。
我用Google搜索了几个小时无济于事,我不确定这里出了什么问题。任何帮助将不胜感激。
答案 0 :(得分:2)
为了避免指针错误你刚刚遇到我建议简化你的动态2D数组分配 - &gt;
int (*array) [Y] = malloc(sizeof(int[X][Y]));
像这样访问您的数组 - &gt;
int g=array[0][0];
并设置如下 - &gt;
array[0][0]=0;
这将大大简化您的解决方案,您还可以获得包含2D阵列作为奖励的连续内存块。这也将简化写入和读取文件,因为如果由于其他原因不一定必须这样做,则不需要遍历每个元素。
/ A
答案 1 :(得分:1)
尝试修改您的功能:
void readSudokuFile(char* filename, int** grid) {
// ...
grid[i][j] = curr;
}
并像这样调用它:
readSudokuFile(filename, sudoku)