エラーを説明するには: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
を使用するのでは、次のとおりです。ここで宣言の構文は次のとおりです。
理想的には、1次元の「ベクトル」または「ユニークな識別子」を使用し、3次元を数学で偽装する必要があります。 –
NathanOliver
@ MichaelO.あなたの提案は、同じ「式は一定の値を持たなければならない」というエラーをスローします。編集: "const int NZ - countZ"はタイプでした - 私は適切な "="を持つために投稿を編集しました。 – Roka545
短い答え:*これはできません*。長い答え:*あなたはこれをしないでください*。配列自体のサイズを追跡しないため、配列は間違ったツールです。 NathanOliverのコメントを参照してください。 –