我是 C++ 新手,我有一个应该很简单的问题,但这让我抓狂。我正在尝试设置一个二维数组。该数组在 Solver.h
中声明如下:
protected:
static const int gridSize = 9;
int theGrid[gridSize][gridSize]
int *boxes[gridSize][gridSize];
...
我正在尝试在 Solver::Solver()
中初始化它,如下所示:
boxes[0] ={ &theGrid[0][0],&theGrid[0][1],&theGrid[0][2],
&theGrid[1][0],&theGrid[1][1],&theGrid[1][2],
&theGrid[2][0],&theGrid[2][1],&theGrid[2][2]
};
...
但是我收到的错误是“表达式必须是可修改的左值”和“错误:需要一个表达式”。这对我来说没有意义,因为我的印象是 boxes[0]
是 一个可修改的左值。
所以我写了一个很小的(非 OOP)程序,它的 main()
中只有以下内容:
int test[2][2];
test[0]= {1,2};
cout<<test[0][1]; //outputs "2" as expected.
现在我陷入困境和困惑。我在 Solver 类中的赋值例程有什么问题?
回答一些问题:
我确实想要一个多维数组,因为最终我将使用另一个指向 theGrid
内另一组数据的指针数组来设置 boxes[1]
,第三组位于 boxes[2]
中,依此类推。这个想法是采用 9x9 网格并将其分成 3x3 正方形(听起来很熟悉?“求解器”应该简单地解决数独集。)这样我就可以独立检查(和修改)这些 3x3 正方形中的所有值。
我正在尝试让它在 VS2010 中工作。
我确信有一个很好的算法来根据盒子编号来定义哪些数组成员是每个 3x3“盒子”的一部分,但我还没有实现它,而且似乎编码一次比重新编写程序更浪费。 - 每次检查答案时循环创建这些框。对于该程序的范围,theGrid
的大小是不可更改的,因此我的良心会让我避免进行一些硬编码。
最佳答案
问题是 { ... }
不是一个表达式,它是一个初始化器。一些编译器有一个扩展,允许使用 {}
形成表达式,并且 C++0x 为大括号添加了几个新含义,但我将将此保留为标准 C++。
我认为最好的通用解决方案是编写循环代码。您真的不想写掉所有冗余,对吧?
Solver::Solver() {
for ( int boxnum = 0; boxnum < 9; ++ boxnum ) {
for ( int cellnum = 0; cellnum < 9; ++ cellnum ) {
boxes[ boxnum ][ cellnum ]
= &grid[ boxnum/3*3 + cellnum/3 ][ boxnum%3*3 + cellnum%3 ];
}
}
}
检查了代码...我相信这就是您想要的模式。
关于c++ - 在c++中设置嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3663316/