2013-07-28 77 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