2014-11-03 158 views
0

我有一個指向4維數組的指針;我想用它來爲4維數組賦值。使用多指針數組指針

我知道什麼是創建一個4維數組並使用指針浮

float dArray [2][3][4][5]; 
float *ptr = &dArray[0][0][0][0]; 

通過它遍歷什麼,我掙扎是,如果我有指針4dimensional陣列

float ***pointerArray4D[]; 

和說我想在它下面的數組中使用它的存儲值 - 我該怎麼做。

value = 0; 
for (int ix0 = 0; ix0 < DIM0; ++ix0) 
for (int ix1 = 0; ix1 < DIM1; ++ix1) 
    for (int ix2 = 0; ix2 < DIM2; ++ix2) 
    for (int ix3 = 0; ix3 < DIM3; ++ix3) 
    pointerArray4D[ix0][ix1][ix2][ix3] = float(value++); 

我試圖做的是

1)

float pointerArray4D_1[2][3][4][5]; 
float ***pointerArray4D[5]; 
pointerArray4D = pointerArray4D_1; 

2),我想我應該做的另一件事是分配內存吧

pointerArray4D=new float*[2]; 
for(int i=0; i<2; ++i) 
    pointerArray4D[i]=new float*[3]; 
for(int i=0; i<3; ++i) 
    pointerArray4D[i]=new float*[4]; 
for(int i=0; i<4; ++i) 
    pointerArray4D[i]=new float[5]; 

錯誤:期望的構造函數,析構函數或類型轉換在'='標記之前

不用多說了新的蜜蜂學習藝術的:)

編輯 - 採用雙層代表我能夠穿越

回答

0

這個的想法的錯字......

double dArray [2][3][4][5]; 

...聲明一個數組。有與其關聯的2 * 3 * 4 * 5 double的存儲空間。

這...

float ***pointerArray4D[]; 

...宣稱的float ***未指定長度,它是實際上在所有法律(即,在文件範圍內)的數組。這實際上與float ****相同。除非您分配一些存儲空間,否則沒有關聯的存儲空間用於實際的任何float。此外,您分配給pointerArray4D的空間預計將保留float ***(根據其聲明)的值。你可以用這個工作,但你必須執行四個級別的分配。

假設DIM0 - DIM3是預處理宏,你也許希望這樣的事情,而不是:

float (*pointerArray4D)[DIM1][DIM2][DIM3]; 

pointerArray4D = malloc(DIM0 * sizeof(*pointerArray4D)); 

...之後就可以處理pointerArray4D完全一樣,你會做dArray。 (但是,當你完成它時,不要忘記free(pointerArray4D)。)

+0

注意,這個答案假定C,這是不一樣的東西C++。 – 2014-11-03 22:20:53

+0

'float *** pointerArray4D [];'不聲明'float ****'。在C++中它是非法的。在C中它在文件範圍內是合法的,並且是'float ***'數組的臨時定義,但是OP似乎總是在塊範圍內使用它。 – 2014-11-03 22:57:01

+0

@MattMcNabb,我確實已經注意到我的答案屬於C而不是C++。關於C,cdecl調用'float *** pointerArray4D []''float *'的一個*數組*的聲明,其衰變爲'float ****',而不是'float ***'。我承認在那裏存在一些不精確的地方,但是對於大多數意圖和目的,'float ****'可以代替'float *** pointerArray4D []'在任何後者被允許的地方使用。 – 2014-11-03 23:18:48

0

首先,user3353819的提示如下:

think of double array[a][b][c][d] as simply an array of doubles of length a * b * c * d. This means you would find the first element with &array which is of type double*

看你的代碼:

float ***pointerArray4D[]; 
value = 0; 
for (int ix0 = 0; ix0 < DIM0; ++ix0) 
for (int ix1 = 0; ix1 < DIM1; ++ix1) 
    for (int ix2 = 0; ix2 < DIM2; ++ix2) 
    for (int ix3 = 0; ix3 < DIM3; ++ix3) 
    pointerArray4D[ix0][ix1][ix2][ix3] = float(value++); 

做了正確的方法是:

float fArray[DIM0][DIM1][DIM2][DIM3]; 
float *pointerArray = &fArray[0][0][0][0]; 
float fValue = 0; 
for (int ix0 = 0; ix0 < DIM0; ++ix0) 
for (int ix1 = 0; ix1 < DIM1; ++ix1) 
    for (int ix2 = 0; ix2 < DIM2; ++ix2) 
    for (int ix3 = 0; ix3 < DIM3; ++ix3) 
    pointerArray[ ix0*DIM1*DIM2*DIM3 + ix1*DIM2*DIM3 + ix2*DIM3 + ix3 ] = fValue++; 

的關鍵在於尺寸爲[DIM0] [DIM1] [DIM2] [DIM3]的陣列在內存中是一個連續空間 持有「DIM0倍含有嵌段」,「DIM1倍含有」,「DIM2倍含有嵌段」,「DIM3倍浮法」

作爲esemplification下面的代碼給出相同的結果的塊:

float fArray[DIM0][DIM1][DIM2][DIM3]; 
float *pointerArray = &fArray[0][0][0][0]; 
float fValue = 0; 
for (int ix0 = 0; ix0 < DIM0; ++ix0) 
for (int ix1 = 0; ix1 < DIM1; ++ix1) 
    for (int ix2 = 0; ix2 < DIM2; ++ix2) 
    for (int ix3 = 0; ix3 < DIM3; ++ix3) 
    *pointerArray++ = fValue++; 

或甚至更好:

float fArray[DIM0][DIM1][DIM2][DIM3]; 
float *pointerArray = &fArray[0][0][0][0]; 
float fValue = 0; 
const int nElem = DIM0*DIM1*DIM2*DIM3; 
for (int ix = nElem; ix>0; --ix) 
    *pointerArray++ = fValue++; 

希望這回答您的問題,有一個美好的夜晚,斯特凡諾

+0

@MattMcNabb,'fArray [0] [0] [0] [0];'是一個float,'&fArray [0] [0] [0] [0];'是一個'float' 。它編譯。 – 2014-11-03 23:08:05

+0

對不起,我誤讀了 – 2014-11-03 23:12:12