我正在尝试使用某些数据来创建初始化 VAO特定索引的功能。问题是,当我访问 sizeof vertices 时,返回错误的大小。
以下是数据:
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 :(得分:2)
在C ++中,编译器将any_type[]
类型的函数参数视为any_type*
。
因此vertices
的类型实际上是一个指针,并且您正在使用sizeof(vertices)
获得指针的大小。
std::array
或std::vector
,其中包含有关其大小的信息。答案 1 :(得分:1)
你传入函数的参数const Vertext vertices[]
本质上是一个指针,这就是它显示为4的原因。你必须以某种其他方式将数组的大小传递给你的函数。通过将大小作为单独的参数传递。
您可以在之前提到的类似问题here中找到更多详细信息。
答案 2 :(得分:1)
每次按值将数组传递给函数时,它都会衰减为指针,无论您将其作为arr[]
或arr[size]
传递,因此{{1}报告的大小将是一个指针,即一般4或8个字节。如果要传递数组并“检测”其大小,可以通过模板非类型参数通过引用传递它,如下面的简单示例所示:
sizeof