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

How to pass a c-array to a method in Objective-C?

我目前正在尝试将 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 指针并丢失了除第一个数字之外的所有数据。我一直试图为此找到解释,但我发现的答案中有 none 行之有效。有什么办法可以解决这个问题,还是我做错了?

您传递 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) 不同,后者表示指针本身的大小。