2013-07-28 78 views
0

我有一个指针妥善处理指针的指针

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

我decleared多阵列那样的数组,然后我把一些价值在这种方式(并确认值是否正确与COUT -

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

我有相当复杂的价值在那里像10663.3,11140.6等,这需要在正确的位置,所以我不认为我能越来越误报有

最后IM试图将数据写入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); 

然而,当我开始从文件中读取我得到的乱码。我的猜测是,我以错误的方式将数组赋给了方法。但我无法弄清楚正确的方法。

我也很喜欢指针指针的一个很好的教程。我一直无法找到一个

回答

2

当您按照您所做的方式创建数组数组时,它并不是连续的。你基本上有NX数组在NX不同的地方在内存中的某个地方。我不知道put函数的功能是什么,但基于它的签名,它可能需要一个连续的浮点数组。但是无论它期望如何,除了第一个数组之外,它不可能访问您的数据,因为关于其他数组的位置的信息在&data[0][0]中不可用。

你可以做的是创建一个单维数组,并把它看作二维的一些简单的数学。

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

这是你如何会在位置(X,Y)访问数组:

data[x * NY + y] = 1.234; 

然后把它传递给put功能是这样的:

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

你可能会想要将其封装在处理算术的类中,或者可以在已经完成的库中使用库,例如​​Boost.MultiArray

+0

这很有道理。但是,如果我像这样初始化数据,那么它是否还在堆上?这很重要,因为我离开浮动数据[NX] [NY]的原因是因为我引起了stackoverflow – user1047833

+0

@ user1047833:是的。 –

+0

我想我需要在一个类中包装数组,因为我需要为put方法创建一个存取器。因为目前它并不完全得到它 – user1047833