2016-03-31 17 views
-3

多次元(intの場合は2次元の配列)を宣言したいと思います。私はグローバル配列のサイズを宣言することはできません。一次元では、すべてが動作します:宣言のないポインタの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; 
} 

しかし、私は2次元配列を宣言する場合、私はエラーを取得する: 「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ポインタ用メモリを割り当てます。
boolM要素のメモリを各ポインタに割り当てます。

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を*)を行うことによって、一意のインデックスでアクセス。それを隠すには、2つのパラメータを持つ関数を作成します。

0

あなたは真のマルチレベルアレイのすべての面倒を避けたい場合は、可能性:

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

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

ele = table[n*M + m]; 

これは時にもう少しを入力することのわずかなコストで死んでシンプルなすべての割り当て/割り当て解除を行い要素にアクセスする。もちろん、それを修正するマクロを使用することもできます。