Ожидаемый конструктор, деструктор или преобразование типа перед '=' token " - PullRequest
2 голосов
/ 20 марта 2012
int sizex = 3;
int sizey = 3;
int * grid;
grid = new int [sizex][sizey];  // Line 6
grid = {{0}};

Я пытаюсь объявить массив здесь, но компилятор говорит

Строка 6: ошибка: ожидаемый конструктор, деструктор или преобразование типа перед маркером '='

Можете ли вы помочь мне понять, почему?

Ответы [ 4 ]

4 голосов
/ 20 марта 2012

Потому что синтаксис неправильный. Это не то, как вы распределяете память.

Если вы хотите матрицу, вы, вероятно, хотите

int** grid;

и вы выделяете память следующим образом:

grid = new int*[sizex];
for ( int i = 0 ; i < sizex ; i++ )
   grid[i] = new int[sizey];

Кроме того, назначение grid = {{0}}; не имеет смысла после того, как вы уже выделили память для grid.

Не забудьте удалить память.

1 голос
/ 20 марта 2012

Как уже было сказано Лучианом и Марком Б, использование new для создания 2D-массива некорректно.

Если вы хотите инициализировать все элементы, используйте следующую конструкцию:

grid = new int*[sizex];
for (int i = 0 ; i < sizex ; i++)
   grid[i] = new int[sizey]();
                         //^^

при этом элементы будут обнулены.

Вы не можете использовать:

grid = {{0}};

для назначения: {} можно использовать только при инициализации.

0 голосов
/ 20 марта 2012
    int main(){
      int** grid;
      int sizex = 5;
      int sizey = 5;
      grid = new int*[sizex];
      for ( int i = 0 ; i < sizex ; i++ )
         grid[i] = new int[sizey];

// ... a lot of code 

// .. deleting:
      for ( int i = 0 ; i < sizex ; i++ )
             delete [] grid[i];
       delete [] grid; 
    }
0 голосов
/ 20 марта 2012

Этот синтаксис нельзя использовать для непосредственного создания 2d-массивов в C ++. Хотя вы можете использовать несколько неясный синтаксис, отмеченный в комментарии (int (*p)[6] = new int[3][6];), я не советую этого делать, поскольку это, вероятно, просто чрезмерно усложнит ваш код.

Вместо этого вам нужен вектор векторов. Эффективное использование вектора защищает управление памятью, поскольку C ++ не является сборщиком мусора.

std::vector<std::vector<int> > grid(sizex, std::vector<int>(sizey));

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