Sizeof数组结构错误
sizeof array struct error
我试图使在特定索引上初始化 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并正确地显示数据。
在c++中,any_type[]
类型的函数参数被编译器当作any_type*
处理。
所以vertices
的类型实际上是一个指针,你得到的是sizeof(vertices)
指针的大小。
- 如果你需要知道你传递给函数的数组的大小,你可以把它的大小作为另一个参数传递。
- 或者你可以像vsoftco说的那样做,在这种情况下,函数模板将为你传递给函数的每个不同数组大小实例化。
- 如果你想要"现代",你也可以传递
std::array
或std::vector
,它们携带有关它们大小的信息。
任何时候你通过值传递一个数组给一个函数,它衰减到一个指针,不管你传递它作为arr[]
或arr[size]
的事实,所以sizeof
报告的大小将是一个指针,即一般4或8字节。如果你想传递一个数组并"检测"它的大小,你可以通过引用通过一个模板非类型参数传递它,就像下面的简单例子:
#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
}
你传递给函数的参数const Vertext vertices[]
本质上是一个指针,这就是为什么它显示为大小4。你必须以其他方式将数组的大小传递给函数,例如将大小作为单独的参数传递。
您可以在前面的类似问题中找到更多细节。
相关文章:
- 创建结构的数组时遇到分段错误
- 使用具有结构不完整类型错误的模板
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 导致Segmentation错误的结构中的矢量
- 编译器指出结构和 int 说明的错误 2059
- 当结构位于单独的头文件中时'unregistered datatype'在 QML 中出现Q_GADGET错误
- 在 C 函数中返回结构会导致分段错误
- C++ 结构错误"调用'erase'没有匹配函数
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 结构中的错误"Incomplete type is not allowed"
- 体系结构x86_64的未定义符号:链接器错误
- 在另一个结构中声明内部结构会导致错误:结构使用无效
- 如何编写一个错误结构,该结构可以包含不同的强键枚举作为错误代码
- 错误:结构的初始值设定项太多
- 带有结构和指针的程序错误(结构,C++)
- 错误:结构的正向声明
- 使用结构体作为参数:错误:结构体未定义
- 定义错误结构体中的枚举
- "Was not declared in this scope"错误结构定义。C++
- GCC中可能的错误:结构中的文字字符串类型