2013-03-09 42 views
0

如何創建一個接收數組作爲參數的正確函數?在下面的代碼中,結果應該是36,但在我的函數中只顯示4.它似乎只是通過第一個元素。C++數組和函數

void test(float v[]){ 
    printf("size: %d\n", sizeof(v)); //RESULT: 4 
} 

int main(){ 
    GLfloat vv[] = { 
     0, 0, 0, 
     1, 1, 0, 
     1, 0, 0 
    }; 
    printf("size: %d\n", sizeof(vv)); //RESULT: 36 
    test(vv); 
    return 0; 
} 

回答

3

如何使接收數組作爲參數正確的功能?

如果數組的大小在編譯時已知,如您的示例中所示,可以使用模板函數。這個例子採用const引用的數組元素:

template< class T, size_t N > 
void foo(const T (&data)[N]) 
{ 
    // length of array is N, can access elements as data[i] 
} 

int main(){ 
    GLfloat vv[] = { 
    0, 0, 0, 
    1, 1, 0, 
    1, 0, 0 
    }; 

    foo(vv); 
}  

這是問題的答案。我會做它使用具有明確的副本類型,分配和引用語義,如std::array

template <size_t N> 
void foo(const std::array<GLfloat, N>& data) 
{ 
    // data looks like a C array, but has size() and many other methods 
} 

int main(){ 
    std::array<GLfloat, 9>{ 
     { 0, 0, 0, 
     1, 1, 0, 
     1, 0, 0 } 
    }; 

    foo(vv); 
} 
7

當您將數組作爲參數傳遞時,它將作爲指向第一個元素的指針衰減。
sizeof給你的指針大小不是數組。

最簡單的解決方案是將大小作爲單獨的參數傳遞給函數。

void myFunction(float[] array, size_t size); 
+2

+1注:在C++中,如果你正在致力於用固定的數組,你可以使用引用參數,例如'template foo(float(&ar)[N])',它也會用'sizeof(ar)'報告正確的大小。 – WhozCraig 2013-03-09 06:52:42

+0

@WhozCraig:確實是+1。我對Q體育提升c和C++標籤的早期懷疑是,這純粹是一個c問題。 – 2013-03-09 06:56:45

+0

從編寫廣義解決方案的角度來看,在大多數情況下,將迭代器傳遞給'begin'和'end'會不會更好?然後該函數可以應用於數組,或者同樣適用於'std :: vector',例如。 – DavidO 2013-03-09 08:16:54