2017-01-04 5 views
2

void * bufferパラメータを取ります。この関数は、HDF hereによって提供されています。私の理解では、データセットの情報をバッファに読み込みます。これは動作しますが、定数値を使用して3次元のint配列を作成する場合に限ります。ユーザによって渡された値を使用して ここでは、その関数の始まりです:パラメータで渡されたC++での3D配列の作成

void* getDataTest(int countX, int countY) 
{ 
    int NX = countX; 
    int NY = countY; 
    int NZ = 1; 

    int data_out[NX][NY][NZ]; //I know this doesn't work, just posting it for reference 

    //. 
    //. more code here... 
    //. 

    // Read function is eventually called... 
    h5Dataset.read(data_out, H5::PredType::NATIVE_INT, memspace, h5Dataspace); 
} 

これは常に私に失敗しかし、DATA_OUTの配列を作成するときのconst int型の値を使用し、私のprevioud実装がうまく働いた:。

void* getDataTest(int countX, int countY) 
{ 
    const int NX = 5; 
    const int NY = 5; 
    const int NZ = 1; 

    int data_out[NX][NY][NZ]; 

    //. 
    //. more code here... 
    //. 

    // Read function is eventually called... 
    h5Dataset.read(data_out, H5::PredType::NATIVE_INT, memspace, h5Dataspace); 
} 

これはうまくいきます。私の理解から、この機能(私はcontロールオーバー)は、同じ次元のデータ空間を必要とする。 3D配列は3D配列でしか動作しませんが、2D配列はデータをバッファにコピーする際に2D配列でのみ動作します)。

ここで私の重要な問題は、読み込み関数が満足する3D int配列を作成する方法を理解できないように思えることです(関数のパラメータはvoid *ですが、 3d int配列以外は動作しません)。私は配列の配列として表現された3D int配列を試しました:

これも同様に失敗しました。どのように私はint arrayName [非定数値] [非定数値] [非定数値]の形式の3D int配列を作成することができます上の任意のアイデア?私は定数ではない値を使って配列を作成できないことを知っていますが、目標を明確にするためにそれらを追加しました。配列をインスタンス化するための値として関数のパラメータを使用するC++の方法があるでしょうか?

+1

:https://support.hdfgroup.org/HDF5/doc/cpplus_RM/class_h5_1_1_data_set.html#a2f0278a519122419ae9981666277c9bb – Creak

+0

おかげで、私は投稿を更新しました。 – Roka545

答えて

2

私は、最も簡単にこれを行うことですと思う:

int* data_out = new int[NX * NY * NZ]; 

あなたは、そのような3次元配列として、この1次元配列にアクセスすることができます。より多くのCで

int value = array[z * NX * NY + y * NX + x]; 

++ 11スタイルでは、std::vectorを使用できます。

std::vector<int> data_out; 
data_out.resize(NX * NY * NZ); 

そして、そのような関数を呼び出す:私は、これはあなたがにリンクしたい方法だと思います

h5Dataset.read(data_out.begin(), H5::PredType::NATIVE_INT, memspace, h5Dataspace); 
+0

私は答えを投票しましたが、コンパイル時定数として 'NX * NY * NZ'を必要とするため、* C++ 1スタイル*の追加のコメントが気になります。その場合、OPは簡単にCこのような質問はしませんでした。 –

+0

True!その後、唯一の解決策はstd :: vectorです。私は自分の答えを編集します。 – Creak

2

はこのようにそれを実行します。

std::vector<int> array; 

    array.resize(Nx*Ny*Nz); 

    array[z*Ny*Nx + y*Nx + x] = value 

それは配列[Z] [Y] [X]の構文があると便利だが、それは価値があるよりも多くのトラブルです支援します。

関連する問題