传递结构指针
我用于在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
不会失败。
编译器错误告诉你,你传递错误的类型到函数中。它期待着一个指向GLuint的指针,并指定一个指向VertexHandler的指针。如果类型在内存中完全相同,则可以使用glGenBuffers(2, (GLuint*) &VBHandlers);
来强制转换该参数。但是,这可能会导致崩溃,因为这些类型可能是内存中的不同表示。
thx我尝试你的方法和工作。 – ffenix 2012-01-28 23:42:55
真的,你应该以他们预期的格式定义这些值。如果glGenBuffers期待2个GLuint的传递数组。在某些情况下,施放结构将会有效,但只能靠运气(并且对所使用的编译器有深刻的理解)。最重要的是,如果有人要通过在这些值之间添加一个字段来修改你的结构,它会破坏你的铸造操作。即使它在这种情况下工作,你也应该避免使用该投射。在硅谷的解决方案将是解决方案的正确方法。 – 2012-01-29 05:06:18
Thx它的工作太多,但当你的意思是记忆表示我没有得到它。一个指向本地结构的指针恰好有8个字节(2个Gluints或2个dword),它与指向具有8个字节的本地数组的指针相同。所以,当你意味着记忆的表现,我没有太多的了解。无论如何,这个程序在两个答案中都有效,thx很多。 – ffenix 2012-01-28 23:48:12
@ user1175832:同样,可能出现这样的情况:两个'GLuint'的数组与''struct'具有完全相同的布局,连同两个'GLuint',在您的特定编译器和/或机器上* 。其他编译器和机器可能不会以同样的方式执行。它是特定于实现的。 – 2012-01-28 23:54:07