传递结构指针

问题描述:

我用于在ASM中编写代码,并且需要为某些OpenGL项目切换到C++。反正我有以下程序:传递结构指针

glGenBuffers(Size, PointerToBuff); 

根据根据尺寸参数(缓冲区数量)我了解的手柄将存储在PointerToBuff。所以我想用一个结构来保存2个手柄,我会在情况得到我使用:

glGenBuffers(2, *PointerToBuff); 

所以我创建一个结构:

struct VertexHandlers 
{ 
    GLuint cubevertex; 
    GLuint trianglevertex; 
}VBHandlers; 

,并使用proc用作这样的:

glGenBuffers(2, &VBHandlers); 

的错误,我得到它:

error C2664: 'void (GLsizei,GLuint *)' : cannot convert parameter 2 from 'main::VertexHandlers *' to 'GLuint *' 
2>   Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
2>C:\Documents and Settings\Owner\My Documents\Downloads\OpenGL-tutorial_v0003\playground\playground.cpp(181): error C2664: 'void (GLsizei,GLuint *)' : cannot convert parameter 1 from 'main::VertexHandlers *' to 'GLsizei' 
2>   There is no context in which this conversion is possible 

我不习惯于“类型转换”几乎不知道的东西,但是关于指向我的指针(&),运算符将获取创建的局部变量的地址。希望我能得到一些帮助,谢谢。

glGenBuffers()需要一个GLuint的数组,而不是指向恰好有两个GLuint的对象的指针。这就是编译器抱怨的原因。是的,它们在你的机器上可能都有相同的内存表示,但在另一台机器上可能不是这种情况。

如果你想的glGenBuffers()结果存储到一个结构,你可以做这样的事情:

GLuint buffers[2]; 
glGenBuffers(2, buffers); 
VBHandlers.cubevertex = buffers[0]; 
VBHandlers.trianglevertex = buffers[1]; 

这是做最安全的,可移植的方法,假设glGenBuffers不会失败。

+0

Thx它的工作太多,但当你的意思是记忆表示我没有得到它。一个指向本地结构的指针恰好有8个字节(2个Gluints或2个dword),它与指向具有8个字节的本地数组的指针相同。所以,当你意味着记忆的表现,我没有太多的了解。无论如何,这个程序在两个答案中都有效,thx很多。 – ffenix 2012-01-28 23:48:12

+0

@ user1175832:同样,可能出现这样的情况:两个'GLuint'的数组与''struct'具有完全相同的布局,连同两个'GLuint',在您的特定编译器和/或机器上* 。其他编译器和机器可能不会以同样的方式执行。它是特定于实现的。 – 2012-01-28 23:54:07

编译器错误告诉你,你传递错误的类型到函数中。它期待着一个指向GLuint的指针,并指定一个指向VertexHandler的指针。如果类型在内存中完全相同,则可以使用glGenBuffers(2, (GLuint*) &VBHandlers);来强制转换该参数。但是,这可能会导致崩溃,因为这些类型可能是内存中的不同表示。

+0

thx我尝试你的方法和工作。 – ffenix 2012-01-28 23:42:55

+0

真的,你应该以他们预期的格式定义这些值。如果glGenBuffers期待2个GLuint的传递数组。在某些情况下,施放结构将会有效,但只能靠运气(并且对所使用的编译器有深刻的理解)。最重要的是,如果有人要通过在这些值之间添加一个字段来修改你的结构,它会破坏你的铸造操作。即使它在这种情况下工作,你也应该避免使用该投射。在硅谷的解决方案将是解决方案的正确方法。 – 2012-01-29 05:06:18