2012-03-19 2 views
2
int sizex = 3; 
int sizey = 3; 
int * grid; 
grid = new int [sizex][sizey]; // Line 6 
grid = {{0}}; 

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

Line 6: error: expected constructor, destructor, or type conversion before '=' token

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

+0

@ Oli Не читается строка 3, по-видимому;) –

ответ

4

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

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

int** grid; 

и вы выделяете память, как это:

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

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

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

+0

Это не работает. Проверьте, в чем дело: http: //codepad.org/1qczj8QH – user1277552

+0

@ user1277552 он работает, но вы не выразили его в контексте. Поместите его внутри 'main' или какой-либо другой функции. –

+0

@ user1277552 там - http://codepad.org/3Gi4vIEB - и я также сказал, что присвоение 'grid = {{0}}' не имеет смысла после выделения. –

0

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

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

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

+0

Предупреждение о педантизме: ваше первое предложение не совсем точно. Подобные вещи действительны: 'int (* p) [6] = new int [3] [6];'. –

0
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 минут назад? –

+0

Он компилируется, я просто был удивлен, что с тобой не так, и все здесь, не так ли? –

1

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

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

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

это будет инициализировать элементы к нулю.

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

grid = {{0}}; 

для задания: {} могут быть использованы только при инициализации.

+0

+1 для демонстрации инициализации значения. – ildjarn

Смежные вопросы

 Смежные вопросы