0

私のクラスには次の機能があります。

bool ncread_llt::get_dataArray_atOnce (float **data)
{
    startp[0]=0;
    countp[0]=ntime;
    float vdata[ntime][nlat][nlon];
    dataVar.getVar(startp, countp, &vdata);
    int offset=0;
    for(int t =0; t<ntime; t++)
    {
        for (int i = 0; i < nlat - 1; i++)
        {
            for (int j = 0; j < nlon - 1; j++)
            {
                offset=i*nlat+j;
                data[t][offset]=vdata[t][i][j];
            }
        }
    }
    return(true);
}

そして、私はこのようにメインプログラムでそれを呼び出します

  float **rain[ntime][rain_pts];  //I get segfault in the next line.
  ncf1.get_dataArray_atOnce (**rain); //ncf1 is an object of the classs ncread_llt

これはベクトル表記で機能しますが、入力として 2 次元配列を必要とするライブラリ関数を使用する必要があります。ここで何を間違えているのかわかりません。ポインター表記のいくつかの組み合わせを試しましたが、コンパイルされず、コンパイルすると(上記の組み合わせ)、セグメンテーション違反が発生します。このコードに何か問題がありますか? また、なぜコンパイルされるのですか?

4

2 に答える 2

0

ありがとう@Serg lef、私は次の方法でそれを行い、その作業を行いました。メモリとポインタの割り当ての概念がよくわかりませんでした。

float **rain;
rain=new float *[ntime];
for (int i=0; i<ntime; i++)
    rain[i]=new float[rain_pts];

その後

ncf1.get_dataArray_atOnce (rain);

返信ありがとうございます。

于 2013-03-26T10:41:42.057 に答える
0

この行は、ポインターの 2 次元配列(この配列を呼び出します)float **rain[ntime][rain_pts];のメモリを作成し、2次元 float 配列 (データ配列へのポインター) にそれぞれ割り当てます。これらのデータ配列のメモリは、この時点では割り当てられていません。Antime*rain_pts

**rainポインターの配列を逆参照Aし、最初のポインター (まだ初期化されていない) を取得し、それをget_dataArray_atOnce関数に渡します。ポインターは初期化されていない逆参照であるため、未定義の動作が発生します。

floatの 2 次元配列を単に関数に渡したい場合はntime*rain_pts、次のように作成できます。

float **rain = new float*[ntime];
for (int i = 0; i < ntime; ++i)
{
    rain[i] = new float[rain_pts];
}

次のように渡すよりも:

ncf1.get_dataArray_atOnce (rain);
于 2013-03-25T19:50:31.433 に答える