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

这东西适用于矢量符号,但我需要使用需要二维数组作为输入的库函数。我不知道我在这里犯了什么错误。我尝试了几种指针表示法的组合,但它没有编译,当它编译时(上述组合)它会出现分段错误。这段代码有什么问题吗?为什么会编译。

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

这一行为float **rain[ntime][rain_pts];一个二维指针数组(让我们称之为这个数组A)创建并分配内存到每个二维浮点数组(指向ntime*rain_pts数据数组的指针)。此时分配这些数据数组的内存。

**rain取消引用指针数组A,并获取第一个指针(尚未初始化),然后将其传递给get_dataArray_atOnce函数。因为指针未初始化,取消引用会导致未定义的行为。

如果您只是想将二维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 回答