这个问题最初出现在我的一个相关问题中,我在阅读一些代码时遇到了麻烦.答案结果证明是这一行
&((GLushort *)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]
评估为指针.并且它被用于
glDrawElements(GL_TRIANGLES, i32Tris * 3, GL_UNSIGNED_SHORT, &((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]);
其中它被解释为绘制顶点索引子集的偏移量.
我的代码目前要求我手动完成openGL在glDrawElements中所做的一些操作,而我无法弄清楚如何将指针用作偏移量.glDrawElements使用索引数组(在我的代码中命名为vertexIndices),所以我尝试过这样的事情:
vertexIndices[&((GLushort *)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]]
但那显然失败了.
编辑1:
我只是尝试了这个并编译......但仍然不确定它是否正确.vertexIndices + (uint) &((GLushort *)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]
这种习惯用法偶尔用在C语言中.优良的做法是将计算封装在宏中,但这是一个副作用.
您遇到的麻烦是:是的,表达式的类型是指针类型,但表达式的解释(如您所知)是一个偏移量.因此,表达式值仅在转换为int时有效.
在glDrawElements()
调用中,表达式值被C的参数规则强制转换为int.
在数组索引中,没有强制规则会自动将表达式转换为int.你必须提供int cast:
vertexIndices[(int)&((GLushort *)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]]
更好的形式是:
#define OFFSET_OF_GLUSHORT_STUFF (m, N) \ ((int)&((GLushort *)0)[3 * (m).sBoneBatches.pnBatchOffset[(N)]]) /*...*/ vertexIndices[OFFSET_OF_GLUSHORT_STUFF(mesh, batchNum)];
WHOA,您刚刚更改了您的问题以指示您正在尝试使用此偏移量来计算指向数组元素的指针.在这种情况下,请勿使用这种基于偏移的方法,因为如果要传递兼容的指针类型,指针数学应该直接工作.如果你没有传递兼容的指针类型,那么就会发生浩劫.
为了您的代码安全,您必须使用一些直接指针数学来使其工作.