2014-11-12 2 views
0
//gives the error expecting a declaration 

int** my_array; 
for (int i=0; i<200; i++) 
{ 
    my_array[i]= new int [200]; 
} 

//initialize array with zeroes 
for (int i = 0; i<200; i++) 
{ 
    for (int j = 0; j<200; j++) 
    { 
     my_array[i][j] =0; 
    } 
} 

Вкратце:Объявление и инициализация глобальной 2D массив

2D-массив объявлены глобально

Он инициализируется в главном. Основной вызывает функцию, которая сохраняет 0's или 1's в специфических клетках массива

массив затем печатается основной

Также совет правильно ли поток?

+1

Для уточнения, 'int **' is * not * 2-d array. – PaulMcKenzie

+0

Можете ли вы опубликовать измененный код? – CodeX

+0

'intmy_array [200] [200] = {0}', но если вы используете C++ USE STL, предпочитайте 'std :: vector' nobodoy как использовать необработанные указатели –

ответ

1

Если вам нужен массив из массива из 200 bools, вы можете использовать std :: array и std :: bitset.

#include <bitset> 
#include <array> 
//... 
std::array<200, std::bitset<200>> my_array; 

Во-вторых, ваш код, даже если вы исправите ошибку синтаксиса, неверен.Вы должны были бы создать my_array таким образом:

int** my_array; 
//... 
my_array = new int * [200]; 
for (int i = 0; i < 200; ++i) 
    my_array[i] = new int [200]; 

Тогда где вы должны удалить эту память:

for (int i = 0; i < 200; ++i) 
    delete [] my_array[i]; 
delete [] my_array; 

Альтернативным, который создает непрерывный блок и использует только два вызова new[]:

my_array = new int * [200]; 
int *pool = new int [200*200]; 
for (int i = 0; i < 200; ++i, pool += 200) 
    my_array[i] = pool; 

Тогда где-то вы должны удалить эту память:

delete [] my_array[0]; 
delete [] my_array; 

Однако я советую вам использовать контейнер, такие как станд :: массив, станд :: BitSet, станд :: вектор и т.д. вместо int** подхода.

+0

полезный ответ! Спасибо – CodeX

+0

Что произойдет, если вы не удалите эту память? Когда программа завершается, эта память автоматически удаляется? – seokhoonlee

+0

Для почти всех современных операционных систем, когда процесс завершается, память освобождается. Однако это не привычка, в которую вы должны попасть (полагаясь на ОС, чтобы освободить память). Что делать, если вы пишете приложение, в котором процесс не завершается (критическое приложение, которое должно работать 24 часа в сутки), или если вы перемещаете функцию туда, где это имеет значение, и память никогда не освобождается? – PaulMcKenzie

1

Что касается синтаксической ошибки, возможно, это связано с чем-то перед кодом, который вы указали.

Показанный код,

int** my_array; 
for (int i=0; i<200; i++) 
{ 
    my_array[i]= new int [200]; 
} 

//initialize array with zeroes 
for (int i = 0; i<200; i++) 
{ 
    for (int j = 0; j<200; j++) 
    { 
     my_array[i][j] =0; 
    } 
} 

компилируется нормально, как тело функции.


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

auto my_array = vector<vector<bool>>(200, vector<bool>(200)); 

vector где находится std::vector из заголовка <vector>.

Это позволяет избежать грубых указателей, new -ing`, петель и т. Д., Все, что вам кажется проблематичным.


В качестве альтернативы вы можете объявить его как это:

vector<vector<bool>> my_array(200, vector<bool>(200)); 

Обратите внимание, что глобальная переменная, как правило, хлопотно, лучше избегать.

+0

отличный ответ! спасибо – CodeX

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