我是C ++的新手,我有一个问题应该很容易,但这让我很疯狂。我正在尝试设置一个2D数组。数组在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类中的赋值例程出了什么问题?
回答一些问题:
我确实想要一个多维数组,因为最终我将设置boxes[1]
另一个指向theGrid
内另一组数据的指针数组,boxes[2]
中的第三组数据等等。想法是采用9x9网格并将其分成3x3方格(听起来很熟悉?“解算器”应该简单地解决数独集。)所以我可以独立地检查(并修改)这些3x3方格中的所有值。
我试图在VS2010中使用它。
我确定有一个很好的算法来定义哪个数组成员是每个3x3“盒子”的一部分,基于那个盒子号码,但是我还没有打到它,并且编写一次它比编写程序更浪费 - 每次检查答案时,在循环中创建这些框。对于这个程序的范围,theGrid
的大小是不可更改的,所以我的良心会让我逃脱一点点硬编码。
答案 0 :(得分:1)
看到你有
int *boxes[gridSize][gridSize];
只需进行测试并将其更改为:
int boxes[gridSize][gridSize];
您可以这样做(我正在使用Visual C ++控制台应用程序来测试它):
int boxes[gridSize][gridSize] = {
{1, 3, 5}, /* y[0][0], y[0][1], y[0][2] */
{2, 4, 6}, /* y[1][0], y[1][1], y[1][2] */
{3, 5, 7} /* y[2][0], y[2][1], y[2][2] */
};
Visual C ++不接受这个:
int test[2][2];
test[0]= { 1, 2 }; // error C2059: syntax error : '{'
cout << test[0][1];
答案 1 :(得分:1)
我认为它希望左值为:
&boxes[0][0] = ...
答案 2 :(得分:1)
问题是{ ... }
不是表达式,而是初始化程序。有些编译器有一个扩展,允许使用{}
形成表达式,而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 ];
}
}
}
检查代码......我相信这是你想要的模式。
答案 3 :(得分:0)
您将boxes
声明为boxes[9][9]
,因此要初始化它,您需要指定boxes[0][0]
。好吧至少初始化那个内存块。
我可能会弄错,但看起来你不想让boxes
成为一个多维数组。
答案 4 :(得分:0)
我不确定你工作的示例代码。至少我的编译器无法消化它(gcc 4.2)。 原因是{...}在初始化时使用,而你正在做的是赋值。
你可以尝试这个for (unsigned i=0; i < gridSize; ++i) {
for (unsigned j=0; j < gridSize; ++j) {
boxes[i][j] = &theGrid[i][j];
}
}
答案 5 :(得分:0)
int main(){
int buf[2][2];
cout << typeid(buf[0]).name();
}
此伪程序打印相当于int [2]
。这意味着buf[0]
的类型为array of 2 integers
。
在C ++中,数组是不可修改的左值。它可以是初始化但不分配给。
您的代码尝试分配给boxes[0]
,这是不正确的。解决方案当然是Potatoswatter和许多上述帖子所建议的