2015-10-12 130 views
0

我試圖使函數初始化 VAO在特定索引,與一些數據。問題是,當我訪問頂點的大小時,返回的大小錯誤。sizeof數組結構錯誤

下面是數據:

typedef struct { 
    GLfloat XYZW[4]; 
    GLfloat RGBA[4]; 
} Vertex; 

const Vertex Vertices2[] = 
{ 
    { { 0.25f, 0.25f, 0.0f, 1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f } }, 
    { { 0.75f, 0.25f, 0.0f, 1.0f },{ 0.0f, 1.0f, 0.0f, 1.0f } }, 
    { { 0.50f, 0.75f, 0.0f, 1.0f },{ 0.0f, 0.0f, 1.0f, 1.0f } } 
}; 
const Vertex Indices2[] = {....} 

我調用該函數是這樣的:

createArrayObjects(0, Vertices2, Indices2); 

void createArrayObjects(int index, const Vertex vertices[], const GLubyte indices[]){ 
    cout << sizeof(vertices) << endl; ---> returns 4 
    cout << sizeof(Vertices2) << endl; ---> returns 96 
... 
} 

如果我使用sizeof(Vertices2),填補VBO,該程序運行正常。 如果在輸入vertices上沒有正確的尺寸,我無法填充VAO和VBO並正確顯示數據。

+0

函數參數指定一個未知大小的數組,這就是爲什麼'sizeof()'不會返回所期望的值。如果你沒有傳遞知道它們自己大小的對象(例如STL容器類),那麼你需要傳遞一個數組長度以及數組指針到函數中。 – gigaplex

+0

@gigaplex不,函數參數指定一個_pointer_,它可以是一個數組衰減到一個指針,但[它也可以是一個甚至不指向數組的指針](http://goo.gl/lIZpmQ )。 – emlai

+0

@zenith確實如此,但未知長度的數組與指針之間幾乎沒有區別。唯一真正的區別是語法,他們在問題中使用了數組語法。 – gigaplex

回答

2

在C++中,函數參數被編譯器視爲any_type*

所以vertices的類型是一個真正的指針,你得到的指針的大小爲sizeof(vertices)

  • 如果您需要知道傳遞給函數的數組大小,可以將其大小作爲另一個參數傳遞。
  • 或者您可以像vsoftco所說的那樣做,在這種情況下,函數模板將針對傳遞給函數的每個不同數組大小進行實例化。
  • 如果你想成爲「現代」,你也可以通過一個std::arraystd::vector,其中攜帶有關其大小的信息。
+0

是的,那就是我剛剛做的,當我調用函數時,我添加了另一個參數與真正的大小 – andre

1

您傳遞給函數的參數const Vertext vertices[]本質上是一個指針,這就是爲什麼它顯示爲4的原因。您必須以某種其他方式將數組的大小傳遞給函數,例如通過傳遞在大小上作爲一個單獨的參數。

您可以在先前詢問here的類似問題中找到更多相關信息。

1

傳遞數組通過值的函數的任何時間,它衰變爲指針,不管你把它作爲arr[]arr[size],所以通過sizeof報告大小將是一個指針,即,在這樣的事實一般4或8字節。如果要傳遞一個數組和「檢測」它的大小,可以通過模板非類型參數通過引用將它傳遞,如在下面的簡單示例:any_type[]類型的

#include <iostream> 

template<typename T, int N> 
void f(T(&arr)[N]) 
{ 
    std::cout << "Size: " << N; 
} 

int main() 
{ 
    double arr[10]; 
    f(arr); // outputs 10 
}