将数组作为参数传递时出现问题
Issue passing Array as Parameter
我正在使用顶点缓冲区和元素缓冲区。
以下函数将顶点和元素数据作为数组,并从中创建缓冲区。我的实际实现更复杂,当然会存储 id 以供以后使用,但这与这个问题无关。
void Create(const float Vertices[], const int Elements[])
{
GLuint VertexBuffer, ElementBuffer; // ids
glGenBuffers(1, VertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
glGenBuffers(1, ElementBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ElementBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Elements), Elements, GL_STATIC_DRAW);
}
在另一个函数中,我调用Create()
传递两个表示多维数据集的数组。但什么也没发生。窗户打开,我看到矢车菊蓝色背景,没有任何立方体。
float VERTICES[] = {-1.f,-1.f,1.f,1.f,0.f,0.f,.8f,1.f,-1.f,1.f,0.f,1.f,0.f,.8f,1.f,1.f,1.f,0.f,0.f,1.f,.8f,-1.f,1.f,1.f,1.f,1.f,1.f,.8f,-1.f,-1.f,-1.f,0.f,0.f,1.f,.8f,1.f,-1.f,-1.f,1.f,1.f,1.f,.8f,1.f,1.f,-1.f,1.f,0.f,0.f,.8f,-1.f,1.f,-1.f,0.f,1.f,0.f,.8f};
int ELEMENTS[] = {0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3};
Create(VERTICES, ELEMENTS);
如果我在 Create()
函数内移动顶点和元素数据,一切正常,立方体正确呈现。
void Create()
{
GLuint VertexBuffer, ElementBuffer;
float VERTICES[] = {-1.f,-1.f,1.f,1.f,0.f,0.f,.8f,1.f,-1.f,1.f,0.f,1.f,0.f,.8f,1.f,1.f,1.f,0.f,0.f,1.f,.8f,-1.f,1.f,1.f,1.f,1.f,1.f,.8f,-1.f,-1.f,-1.f,0.f,0.f,1.f,.8f,1.f,-1.f,-1.f,1.f,1.f,1.f,.8f,1.f,1.f,-1.f,1.f,0.f,0.f,.8f,-1.f,1.f,-1.f,0.f,1.f,0.f,.8f};
int ELEMENTS[] = {0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3};
glGenBuffers(1, VertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
glGenBuffers(1, ElementBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ElementBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(ELEMENTS), ELEMENTS, GL_STATIC_DRAW);
}
因此,我假设将数组传递给Create()
函数时出现问题。我没有收到任何编译器错误或警告。这是怎么回事?
类型为
const float Vertices[]
的参数实际上与 const float Vertices*
相同。所以sizeof
只是返回指针的大小。
请改用模板对数组的引用:
template<std::size_t VerticesN, std::size_t ElementsN>
void Create(const float (&Vertices)[VerticesN], const int (&Elements)[ElementsN])
{
// ...
}
// Usage is the same since template argument deduction
float VERTICES[] = {-1.f,-1.f,1.f,1.f,0.f,0.f,.8f,1.f,-1.f,1.f,0.f,1.f,0.f,.8f,1.f,1.f,1.f,0.f,0.f,1.f,.8f,-1.f,1.f,1.f,1.f,1.f,1.f,.8f,-1.f,-1.f,-1.f,0.f,0.f,1.f,.8f,1.f,-1.f,-1.f,1.f,1.f,1.f,.8f,1.f,1.f,-1.f,1.f,0.f,0.f,.8f,-1.f,1.f,-1.f,0.f,1.f,0.f,.8f};
int ELEMENTS[] = {0,1,2,2,3,0,1,5,6,6,2,1,7,6,5,5,4,7,4,0,3,3,7,4,4,5,1,1,0,4,3,2,6,6,7,3};
Create(VERTICES, ELEMENTS);
这里的问题是sizeof(VERTICES)
和sizeof(ELEMENTS)
。在 Create()
方法中使用时,数组的大小是已知的,但是当您将数组作为参数传递时(如在Create(const float Vertices[], const int Elements[])
中一样),数组降级为指针,并且sizeof
减少为返回指针的大小。
一个简单的解决方案是将大小与数组一起传递。所以函数将如下所示:
void Create(const float Vertices[], size_t VertSize, const int Elements[], size_t ElemSize) {
...
}
但我想我更喜欢使用具有size()
功能的新 std::array 的解决方案:
void Create(const std::array<float>& vertices, std::array<int>& elements) {
...
}
如果您没有机会使用 c++ 11,boost 库将提供 boost::array,它反映了 c++ 11 的行为。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用指向成员的指针将成员函数作为参数传递
- 如何将参数传递给正在使用模板的类
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将部分流作为参数传递
- 我正在开发服务器,ip作为参数传递不起作用
- 将成员函数指针作为参数传递给模板方法
- 如何在C++中将迭代器作为函数参数传递
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 错误:如何通过参数传递来解决此问题
- 将数组作为参数传递时出现问题
- 将对象作为参数传递时出现问题
- POSIX线程同步和/或pthread_create()参数传递问题
- 将常量引用对象作为参数传递时出现问题,VS 调试器报告"'.getXCoord'左侧必须具有调用/结构/联合"
- 此互操作 C#/托管/非托管C++参数传递有什么问题?
- 将向量<string>作为函数参数传递时出现问题 C++
- C++编译器问题 (?):无法将参数传递给单独类文件中的函数
- 将std::function作为参数传递时出现问题