如何将 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)
不同,后者表示指针本身的大小。
我目前正在尝试将 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)
不同,后者表示指针本身的大小。