Установка вложенного массива в C ++ - PullRequest
2 голосов
/ 08 сентября 2010

Я новичок в 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] 
          };
...

Но ошибка, которую я получаю, говорит: «выражение должно быть изменяемым lvalue» и «ошибка: ожидалось выражение». Это не имело смысла для меня, потому что у меня сложилось впечатление, что boxes[0] является изменяемым значением l.

Итак, я написал крошечную (не ООП) программу, в которой просто есть следующее: 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 ]

1 голос
/ 08 сентября 2010

Проблема в том, что { ... } это не выражение, это инициализатор.Некоторые компиляторы имеют расширение, позволяющее формировать выражения с использованием {}, а 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 ];
        }
    }
}

Проверенный код ... Я полагаю, что это шаблон, который вы используете.

1 голос
/ 08 сентября 2010

Я думаю, что оно хочет, чтобы lvalue было:

&boxes[0][0] = ...
1 голос
/ 08 сентября 2010

Убедитесь, что у вас есть

 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];
0 голосов
/ 08 сентября 2010
int main(){
   int buf[2][2];
   cout << typeid(buf[0]).name();
}

Эта псевдопрограмма печатает эквивалент int [2].Это означает, что тип buf[0] является array of 2 integers.

. В C ++ массив является неизменяемым Lvalue.Он может быть инициализирован, но не назначен.

Ваш код пытается присвоить boxes[0], и это неправильно.Решение, конечно, так же, как было предложено Potatoswatter и многими из вышеупомянутых постов

0 голосов
/ 08 сентября 2010

Я не уверен, что приведенный вами пример кода работает. По крайней мере, мой компилятор не может переварить его (gcc 4.2). Причина этого в том, что {...} используются во время инициализации, а вы выполняете присваивание.

вы можете попробовать это

for (unsigned i=0; i < gridSize; ++i) {
     for (unsigned j=0; j < gridSize; ++j) {
            boxes[i][j] = &theGrid[i][j];
      }
}
0 голосов
/ 08 сентября 2010

Вы объявляете boxes как boxes[9][9], поэтому для его инициализации необходимо указать boxes[0][0].Ну, по крайней мере, инициализируйте этот блок памяти.

Я могу ошибаться, но похоже, что вы не хотели делать boxes многомерным массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...