这是我的第一篇stackoverflow帖子。
我在edx上做CS50课程,目前我遇到问题集3.我正在实施十五岁的游戏。 init()函数初始化板,draw函数应该绘制它,但是存在问题。
draw函数没有从init()函数中获取值。我试验过它,在init()函数中值是正确的,但在draw函数中它们都是0。
有什么问题?
error_reporting(E_ALL);
ini_set('display_errors','1');
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
答案 0 :(得分:1)
这可能会对您有所帮助:https://www.tutorialspoint.com/cprogramming/c_scope_rules.htm
基本上你在init函数中所做的一切(变量名和值)只在这个函数或块中有效。
要解决这个问题,您可以通过在主函数上方声明它来使int board[d][d];
成为全局变量(非常不鼓励!):
int board[d][d];
int main(int argc, char** argv){ ... }
或者您可以将变量board[d][d]
作为对函数draw
的引用。 这有效但效率低,因为整个变量将被复制。
void draw(int board[][]){...}
或者您可以使用c命令board[d][d]
在堆上为malloc
分配内存,请参阅man malloc。那么你的代码应该是这样的。
void *ptr = malloc(sizeof(board)); //you need to error check this. See man malloc
如果这样做,您只需将指针传递给函数中的数据即可。这样更有效,因为数据保留在堆内存中。
答案 1 :(得分:1)
您的board[][]
是一个局部变量,因此只能在init()
环境中使用。
我也参加了CS50x课程,他们处理我们的fifteen.c
文件实际上已经在第27行声明了board[][]
变量:int board[DIM_MAX][DIM_MAX];
,它已经是全局的。
所以你不需要创建另一块板子,只需使用他们处理的板子。