2016-10-21 27 views
4

函數被定義爲:通過在C++中引用傳遞三維陣列

int strip(double *signalstnV){ 
. 
. 
return 0; 
} 

而且主要功能它被稱爲:

main{ 
. 
. 
double signalstnV[iteration][2*range+1][3]; 
. 
. 
check = strip(signalstnV); 
. 
} 

我想使用在主後下一個函數的陣列它在條帶功能中被修改。但是在編譯過程中我得到一個錯誤如下

sim.C:在函數 '廉政主(INT,CHAR **)':

sim.C:54:26:錯誤:無法轉換「雙()[151] [3]'將''作爲參數'1'變爲'int strip(double *)'

check = strip(signalstnV);

我無法理解它。請幫忙。 我的主要目標是從strip函數生成數組,並將其傳遞給代碼中的其他函數。

此外,當我在另一個函數

threshold(double * signalstnV) 

使用該陣列,並使用用於循環提取一些特定的值,它使誤差爲:

invalid types ‘double[int]’ for array subscript 
if (signalstnV[k][j][3] < -0.015){ 
..} 
+2

如果這是一個C++的問題,那麼請不要選擇「C」標籤。還請顯示'iteration'和'range'的定義。 –

+0

迭代和範圍是整型常量,我使用整個代碼 –

+0

@ user3121023只適用於C,而不是C++ –

回答

5

一個普通的一維數組衰變到一個指向它的第一個值的指針。多維數組只在其第一維中衰減,衰減爲指向數組的最初第二維的指針。

如果你想「超衰變」多維數組的指針它的第一個值,然後只需做你自己:

check = strip(&signalstnV[0][0][0]); 
+0

非常感謝,我真的不知道這個概念。 –

+0

使用超級衰減很好,但現在當我在另一個函數閾值(double * signalstnV)中使用此數組並使用for循環提取某些特定值時,它會給出錯誤:無效類型'double [int]'用於數組下標 if(signalstnV [k] [j] [3] <-0.015){ –

+1

因爲它是一個指針,當然,而不是多維數組。 –

2

對於這樣的情況,或多或少複雜的類型 - 使用類型別名:

//double signalstnV[iteration][2*range+1][3]; 
using IterationValues = double[iteration]; 
using IterationRangesValues = IterationValues [2*range+1]; 
//... 

那麼,很明顯,調用此:

IterationRangesValues signalstnV[3]; 
check = strip(signalstnV); 

您甲腎上腺素編輯此簽名:strip(IterationRangesValues * matrix)或此strip(IterationRangesValues (& matrix)[3])。當然,對於最後一個數組,您也可以使用typedef。

您也可以使用std::array

using IterationValues = std::array<double, iteration>; 
using IterationRangesValues = std::array<IterationValues, 2*range+1>; 
//... 
+0

我的事'std :: array'是最好的選擇 – Raindrop7

+0

std :: array只能在C++中工作 – Andrej

+0

@Alex - 編輯完成 – PiotrNycz

0

按引用傳遞數組,一個辦法是:

template<size_t X, size_t Y, size_t Z> 
int strip(double(&strip)[X][Y][Z]) 
{ 
} 

然後你就可以用數組的各種大小調用它。

如果你只需要支持一個尺寸,然後取出template線,並與您需要支持的實際尺寸替換XYZ