gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:18:31 25 4
gpt4 key购买 nike

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

最佳答案

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

关于objective-c - 如何将 c 数组传递给 Objective-C 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29159416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com