0

私はポインタの配列を持っています

float** data = new float*[NX];
for(int i = 0; i < NX; ++i)
{
    data[i] = new float[NY];
}

そのようにマルチアレイを宣言した後、この方法でいくつかの値を入れました(そして、値が cout で正しいことを確認しました-

Loop{
    data[i][j] = someValue;
    cout << data[i][j];
}

10663.3、11140.6 などの非常に複雑な値があり、正しい位置に配置する必要があるため、そこで誤検知が発生する可能性はないと思います

最後に、データを NetCDF ファイルに書き込もうとしています

メソッドはそのように見えます

NcBool put(const float* vals, long c0, long c1, long c2, long c3, long c4)

この例から抜粋: http://www.unidata.ucar.edu/software/netcdf/examples/programs/simple_xy_wr.cpp

私はそのようにそれをやった

fileData->put(&data[0][0], NX, NY);

ただし、ファイルから読み取りを開始すると、意味不明になります。私の推測では、配列をメソッドに間違った方法で与えていると思います。しかし、私は正しい方法を理解できません。

また、ポインタへのポインタに関する優れたチュートリアルもありがたく思います。私は1つを見つけることができませんでした

4

1 に答える 1

2

あなたがやっている方法で配列の配列を作成すると、それは連続していません。基本的に、メモリ内のどこかに別の場所にNX配列があります。NX関数が何をするのかはわかりませんがput、そのシグネチャに基づいて、連続した浮動小数点数の配列を想定している可能性があります。しかし、最初の配列以外のデータにアクセスできない可能性があります。これは、他の配列の場所に関する情報が から入手できないためです&data[0][0]

代わりにできることは、1 次元配列を作成し、それを簡単な数学で 2 次元として扱うことです。

float * data = new float[NX * NY];

これは、位置 (x,y) の配列にアクセスする方法です。

data[x * NY + y] = 1.234;

put次に、次のように関数に渡します。

fileData->put(data, NX, NY);

おそらく、これを算術演算を処理するクラスにカプセル化するか、 Boost.MultiArrayなどの既に行われているライブラリを使用できます。

于 2013-07-28T20:09:24.543 に答える