在c ++中设置嵌套数组

时间:2010-09-07 22:50:48

标签: c++ arrays multidimensional-array

我是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的大小是不可更改的,所以我的良心会让我逃脱一点点硬编码。

6 个答案:

答案 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和许多上述帖子所建议的