2016-03-31 1 views
-3

Я хочу объявить многомерный (в его случае двумерный) массив. Я не могу объявить размер глобального массива. С одной размерностью, все работает:C++ многомерный массив указателей без объявления

#include <iostream> 
#include <fstream> 

using namespace std; 

int N, M; 
bool *table; 

int main() 
{ 
    ifstream in ("in.txt"); 
    in >> N >> M; 

    table = new bool[N]; 

    return 0; 
} 

Но если я хочу, чтобы объявить двумерный массив, я получаю сообщение об ошибке: «M» не может появиться в постоянной экспрессии

#include <iostream> 
#include <fstream> 

using namespace std; 

int N, M; 
bool **table; 

int main() 
{ 
    ifstream in ("in.txt"); 
    in >> N >> M; 

    table = new bool[N][M]; 

    return 0; 
} 

Каков мой вариант, помимо объявления числа вместо N и M, создания векторного массива или объявления таблицы в основной функции?

+0

Почему бы вам просто не использовать 'std :: vector', а не беспокоиться об этом? – Barmar

ответ

0

What is my option apart from declaring number instead of N and M, creating vector array or declaring table in main function?

Выделить память для N Указатели.
Для каждого указателя выделите память для M элементов типа bool.

table = new bool*[N]; 
for (int i = 0; i < N; ++i) 
{ 
    table[i] = new bool[M]; 
} 

Когда пришло время освободить, используйте:

for (int i = 0; i < N; ++i) 
{ 
    delete [] table[i]; 
} 

delete [] table; 

Вы можете избежать всех неприятностей выделения памяти и открепления с помощью std::vector.

std::vector<std::vector<bool>> table(N, std::vector<bool>(M)); 
0

Используйте старый способ делать вещи: выделить одномерный массив, а затем получить доступ к этому уникальному индексу, делая расчет (I * N + J). Если вы хотите скрыть, для этого создайте функцию с двумя параметрами.

0

Если вы хотите избежать всех хлопот истинных массивов многоуровневых, вы можете:

int N=2, M=3; 
bool *table = new bool[N*M]; 

// to access the element at (n,m): 

ele = table[n*M + m]; 

Это делает все выделения/открепления мертвым простые с небольшой стоимостью того, чтобы набрать немного больше, когда доступ к элементам. Конечно, вы можете использовать макрос, чтобы исправить это.