我试图从函数返回一个二维数组,但出了点问题。主函数arr2
收到错误,
CXX0030:错误:无法评估表达式
int** file2array(char* filename) {
FILE *fp = NULL;
char c;
int i = 0;
int arr[9][9];
if ((fp = fopen(filename, "r")) == NULL)
{
printf("File could not be opened\n");
}
else
{
while (!feof(fp))
{
c = fgetc(fp);
if (c == '.') {
arr[i/9][i%9] = 0;
i++;
}
if (c>= '1' && c<='9') {
arr[i/9][i%9] = c - 48;
i++;
}
}
fclose (fp);
}
return arr;
}
int main(){
int** arr2 = file2array("SolverInput.txt");
}
答案 0 :(得分:1)
2D数组int arr[9][9]
和指针int **arr
的指针不可互换,使用指向数组int (*arr2)[9]
的指针:
void *file2array(char* filename){
...
int arr[9][9];
...
return arr;
}
int (*arr2)[9] = file2array("SolverInput.txt");
但请注意arr
是一个局部变量(他的生命周期与函数结束),使用malloc
:
void *file2array(char* filename){
...
int (*arr)[9] = malloc(sizeof *arr * 9);
...
return arr;
}
int (*arr2)[9] = file2array("SolverInput.txt");
...
free(arr2);
如果你不知道前面的元素数量(任意数字而不是9)你可以使用可变长度数组(VLA)
void *file2array(char* filename, int dim){
...
int (*arr)[dim] = malloc(sizeof *arr * dim);
...
return arr;
}
int dim = 9;
int (*arr2)[dim] = file2array("SolverInput.txt", dim);
...
free(arr2);
此外,fgetc()
会返回int
(不是char
)
更改
char c;
到
int c;
答案 1 :(得分:0)
当数组作为函数参数传递时,数组表现得非常奇怪。这就是它在C中的表现。只是不要这样做。
相反,您应该将数组嵌入struct
。
typedef struct {
int cell[9][9];
} sudoku;
然后,您可以将sudoku *
而不是int **
传递给该函数。这样可以直接告诉读者您的代码它的作用。 int **
几乎可以表示任何意义,但sudoku *
不能。
int read_sudoku(const char *filename, sudoku *sud) {
if (some error happens)
return -1;
sud->cell[3][8] = 5;
return 0;
}
int main() {
sudoku sud;
if (read_sudoku("sudoku001.txt", &sud) == -1) {
fprintf(stderr, "cannot read sudoku\n");
return EXIT_FAILURE;
}
...
}
这是最简单的。没有malloc
,没有free
,只是执行实际工作的一些代码。