我正在使用OpenGL着色器,该着色器更喜欢C字符串而不是NSStrings,并且遇到了以下奇怪问题:
有关事实是
1)shaderSource定义为
NSString* shaderSource
2)glShaderSource的签名是
glShaderSource(GLuint shader, GLuint count, const GLchar** string, const GLint *length)
这有效:
int len = [shaderSource length];
const char *cstr = [shaderSource UTF8String];
glShaderSource(shader, 1, &cstr, &len);
这不起作用:
glShaderSource(shader, 1, &[shaderSource UTF8String], &[shaderSource length]);
我在这里显然不了解有关 objective-c 的某些信息,并且我想纠正该问题,因此,如果您如此愿意,请告诉我,WTF吗?
最佳答案
您似乎正在使用&[shaderSource UTF8String]
为您提供额外的间接级别,以便类型正确,因为glShaderSource
想要一个指向指针的指针。但是,您不能只是将&
放在任何东西之前以获得指向它的指针。&x
的意思是“返回x的地址”;为了使之有意义,x
必须是一个符号,而不是一个表达式。出于无法编写&[shaderSource UTF8String]
的相同原因,您无法编写&(1 + t)
。那只是一个表达式,您需要将值存储在某个地方,然后您才能传递地址(存储它的位置)。
如果您习惯使用C结构,这可能会造成混淆,因为如果您具有成员foo
的struct bar
,则可以通过编写&foo.bar
来获取成员的地址。但是Objective-C对象不是结构(从技术上讲,它们是不透明的结构)。您可以通过向它们发送消息来从它们获取属性值,这基本上与函数调用相同。因此,如果foo
是一个对象,而bar
是一个属性,则&foo.bar
(实际上是&[foo bar]
的简写)是无效的表达式。
关于objective-c - objective-c 中的指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287314/