2017-01-04 10 views
2

申し訳ありませんが、これはnoobの質問ですが、現在C++を学習しています。私はいくつかのパラメータを取る関数を持っています - 私は3D int配列を作成するときにこれらのパラメータを使用したいと思います。パラメータを使用してC++で3D配列をインスタンス化する

void* testFunction(int countX, int countY, int countZ) 
{ 
    const int NX = countX; 
    const int NY = countY; 
    const int NZ = countZ; 

    int* data_out = new int*[NX][NY][NZ]; 
    // The above line throws the error on "NY" - expression must 
    // have a constant value 
} 

さまざまな投稿から、最初に配列を割り当てる必要があることがわかりましたが、間違っていると思いますか?どのように多次元配列を適切に初期化しますか?また、初期化でポインタが必要なのはなぜですか?

+4

理想的には、1次元の「ベクトル」または「ユニークな識別子」を使用し、3次元を数学で偽装する必要があります。 – NathanOliver

+0

@ MichaelO.あなたの提案は、同じ「式は一定の値を持たなければならない」というエラーをスローします。編集: "const int NZ - countZ"はタイプでした - 私は適切な "="を持つために投稿を編集しました。 – Roka545

+1

短い答え:*これはできません*。長い答え:*あなたはこれをしないでください*。配列自体のサイズを追跡しないため、配列は間違ったツールです。 NathanOliverのコメントを参照してください。 –

答えて

2

エラーを説明するには:C++には、newオペレータにタイプの名前が必要です。 C++のすべての型は静的(コンパイル時に決定)なので、型の名前は実行時の次元を持つことはできません。

例えば、このタイプint[4][5]の3つの要素を割り当てる:

new int[3][4][5]; 

別の例を:

new int[NX][4][5]; 

誤っ例:これはタイプint[4][5]のNX要素を割り当てるこれは、NX要素を割り当てることになりますint[NY][NZ]と入力し、C++に「ダイナミック」タイプがサポートされている場合:

new int[NX][NY][NZ]; 

3次元配列、またはそれのように見える何かを割り当てるために、あなたはstd::vectorを使用することができます。

std::vector<std::vector<std::vector<int>>> my_3D_array; 
... // initialization goes here 
my_3D_array[2][2][2] = 222; // whatever you want to do with it 

構文はそれほど冗長にすると、初期化の合理化、ここtypedef(またはを使用するには)と同じであるusing、:あなたはあなたの関数からこの配列を返すようにしたい場合は、あなたがそれを宣言する必要があり

using int_1D = std::vector<int>; // this is a 1-dimensional array type 
using int_2D = std::vector<int_1D>; // this is a 2-dimensional array type 
using int_3D = std::vector<int_2D>; // this is a 3-dimensional array type 
int_3D data(NX, int_2D(NY, int_1D(NZ))); // allocate a 3-D array, elements initialized to 0 
data[2][2][2] = 222; 

voidポインタをdata変数に返すことはできません。

using int_1D = std::vector<int>; 
using int_2D = std::vector<int_1D>; 
using int_3D = std::vector<int_2D>; 
int_3D testFunction(int countX, int countY, int countZ) 
{ 
    int_3D data(...); 
    ... 
    return data; 
} 

それは他のタイプであるかのように、単にstd::vector<whatever>を使用し、代わりにnewを使用するのでは、次のとおりです。ここで宣言の構文は次のとおりです。

関連する問題