C语言开发数独程序时如何在其他函数中访问main内定义的数组
问题原因
你遇到的grid未声明错误本质是C语言局部变量的作用域限制:在main()函数内部定义的grid数组是函数局部变量,仅在main函数的代码块内有效,其他函数无法直接访问。
error: ‘grid’ undeclared (first use in this function) 121 |
printf("%d ", &grid[i][i]);
解决方法
- 方法1(推荐):将
grid作为参数传递给被调用函数
C语言中固定长度的二维数组可以直接按数组指针形式传递,不需要全局暴露变量,避免命名污染和意外修改。 - 方法2:将
grid定义为全局变量
把grid数组的定义移到所有函数外部,整个文件内的所有函数都可以直接访问,但该写法可维护性差,不推荐使用。
代码中其他需要修正的语法错误
- 函数参数类型错误:
find_empty_box、Answer_Valid等函数的sudoku参数当前定义为int类型,实际需要传入二维数组,应该写为int sudoku[9][9]或者int (*sudoku)[9] - 滥用取地址符
&:&grid[i][i]是取该位置元素的内存地址,你需要输出元素值直接写grid[i][j]即可;另外sudoku[&x][&y]这类写法完全错误,数组下标必须是整数值,不能是变量地址 - 循环变量重名:内外层循环都用了
i作为变量名,会导致内层循环覆盖外层的i值,内层循环应该换用j作为变量名 - 多返回值写法错误:C语言不支持直接返回多个值,
return x,y是逗号表达式,实际只会返回最后一个值y,如果需要返回多个坐标,可以用指针参数或者结构体传递 - 条件判断逻辑错误:
i < 1||2||3||4||5||6||7||8||9的写法不符合C语法,遍历1-9直接写for(int i=1;i<=9;i++)即可
修正后的完整可运行代码示例
#include <stdio.h> #include <stdbool.h> // 提前声明函数原型 bool find_empty_box(int sudoku[9][9], int *x, int *y); bool Answer_Valid(int sudoku[9][9], int guess, int row, int col); bool Solver(int sudoku[9][9]); void print_sudoku(int sudoku[9][9]); int main() { int grid[9][9] = { {8,0,0,0,0,0,0,0,0}, {0,0,3,6,0,0,0,0,0}, {0,7,0,0,9,0,2,0,0}, {0,5,0,0,0,7,0,0,0}, {0,0,0,0,4,5,7,0,0}, {0,0,0,1,0,0,0,3,0}, {0,0,1,0,0,0,0,6,8}, {0,0,8,5,0,0,0,1,0}, {0,9,0,0,0,0,4,0,0} }; printf("原数独:\n"); print_sudoku(grid); if(Solver(grid)){ printf("\n求解结果:\n"); print_sudoku(grid); }else{ printf("\n该数独无解\n"); } return 0; } void print_sudoku(int sudoku[9][9]){ for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { printf("%d ", sudoku[i][j]); } printf("\n"); } } bool find_empty_box(int sudoku[9][9], int *x, int *y) { for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { if (sudoku[i][j] == 0) { *x = i; *y = j; return true; } } } return false; } bool Answer_Valid(int sudoku[9][9], int guess, int row, int col) { // 检查行 for (int i = 0; i <9; ++i) { if (sudoku[row][i] == guess && i != col) { return false; } } // 检查列 for (int i = 0; i <9; ++i) { if (sudoku[i][col] == guess && i != row) { return false; } } // 检查3*3宫格 int row_start = (row / 3) * 3; int col_start = (col / 3) * 3; for (int x = row_start; x < row_start+3; ++x) { for (int y = col_start; y < col_start+3; ++y) { if (sudoku[x][y] == guess && x != row && y != col) { return false; } } } return true; } bool Solver(int sudoku[9][9]) { int row, col; if(!find_empty_box(sudoku, &row, &col)){ // 没有空位,求解完成 return true; } for (int guess = 1; guess <=9; ++guess) { if(Answer_Valid(sudoku, guess, row, col)) { sudoku[row][col] = guess; if(Solver(sudoku)) { return true; } // 回溯 sudoku[row][col] = 0; } } return false; }
内容的提问来源于stack exchange,提问作者HiddenSquid123
相关产品推荐
相关产品推荐

