如何将c-array传递给Objective-C中的方法?

时间:2015-03-20 04:26:52

标签: objective-c c arrays opengl

我目前正在尝试将GLfloat数组传递给方法,如下所示:

[_squareModel setVertexData:gCubeVertexData : 216];  

- (void)setVertexData:(GLfloat*)vertexData : (int)size
{
GLfloat vData[size];

for (int i = 0; i < size; i++) {
    vData[i] = vertexData[i];

}
_vertexData = vData;

glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(_vertexData), _vertexData, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

}  

gCubeVertexData是一个大小为216的GLfloat数组。但是,当我将它传递给方法时,它会转换为GLfloat指针并丢失所有数据,但第一个数字除外。我一直试图找到解释,但我发现的答案都没有奏效。有什么方法可以解决这个问题,还是我做错了?

1 个答案:

答案 0 :(得分:0)

您以与C中相同的方式传递C数组,就像在代码段中一样。

实际上,C不允许传递数组。它只允许传递指针。但是阵列非常容易且无声地退化为指针。

这是一个重要的区别。不了解区别的经典陷阱之一是在指针上使用sizeof并期望获得它指向的数组的大小。这不起作用。指针上的sizeof给出了指针本身的大小(通常为8或4个字节,具体取决于体系结构(64位对32位))。

一旦数组退化为指针,就无法从该指针获得原始数组的大小。

虽然您没有显示_vertextData是什么,但您的代码中可能存在问题。考虑到你如何使用它,它几乎必须是一个指针。

无论如何,您传递vertexData的元素数量,以便计算其大小。您不应该vdata_vertexData,至少为此而言。只需通过size * sizeof(*vertexData)

glBufferData(GL_ARRAY_BUFFER, size * sizeof(*vertexData), vertexData, GL_STATIC_DRAW);

请注意,该sizeof(*vertexData)带有星号,表示vertexData指向的类型的大小(GLfloat)。这与没有星号的sizeof(vertexData)不同,这意味着指针本身的大小。