【问题标题】:Create an array using a function - Objective-C++ [duplicate]使用函数创建数组-Objective-C++ [重复]
【发布时间】:2013-05-10 10:22:02
【问题描述】:

我想从一个函数创建一个数组。以下显然有效,但是因为我的数组要大得多,所以我想节省空间和写出它们的时间。

GLfloat gCubeTextureData_floorj[2] = { 1.0, 1.0 };

在尝试从函数创建数组时,我收到“数组初始值设定项必须是初始值设定项列表”的错误。但是我通过返回列表来初始化数组。这是我的函数调用:

 GLfloat array[2] = [self createCubeTextureFromX1:0.5f toX2:1.0f toY1:0.0f andY2:0.5f];

我已经尝试了以下功能:

-(GLfloat[2]) createCubeTextureFromX1:(float)x1 toX2:(float)x2 toY1:(float)y1 andY2:(float)y2 {
    GLfloat gCubeTextureData_floorj[2] = { 1.0, 1.0 };
    return gCubeTextureData_floorj;
}

我试过了

-(GLfloat[2]) createCubeTextureFromX1:(float)x1 toX2:(float)x2 toY1:(float)y1 andY2:(float)y2 {
    return { 1.0, 1.0 };
}

这两个都不起作用。第一个给我函数中的错误,第二个给我函数调用的错误。这可以吗?

【问题讨论】:

  • 那你用什么语言?您标记了三种语言
  • 我的编译器设置为 Objective-C++,所以我可以使用这三种语言中的任何一种。但是,从我的函数名称中可以看出,我更喜欢使用 Objective-C(或 Objective-C++)。

标签: c++ objective-c arrays function objective-c++


【解决方案1】:

In C, arrays are typically returned using pointers.

要在 Objective-C 中正确执行此操作,我建议从您的方法中返回一个 NSArray。

然而,GLFloats 不是原生的 Objective-C 对象,可以存储在 NSArray 的目录中。为了解决这个问题,我建议使用 NSNumber 或 NSValue 对象来包含您的 GLfloat 值。

【讨论】:

  • 使用 NSArray 和 NSNumber 的问题是我需要使用 glBufferData 中的值,我不知道该怎么做。 (OpenGL ES程序)
  • 无论你在 NSMutableArray 中插入什么,都可以通过“objectAtIndex:”从另一端的(可变或不可变)NSArray 中提取。一旦你熟悉了 Objective-C 数组,它就会变得更容易。
【解决方案2】:

不可能从函数、方法、$whatever 中初始化 C 数组。它只能用初始化列表初始化。 ISO/IEC 9899:TC3, § 6.7.8, 16。 “否则,具有聚合或联合类型的对象的初始化程序应为元素或命名成员的初始化程序的大括号括起来的列表。”

你可以做什么:

使用指针代替 C 数组。在创建函数或方法中堆分配一个数组并返回该数组的指针。调用者负责释放它。

【讨论】:

  • 啊,补充一点:C++ 中的 IIRC 你可以分配数组。但是我的 C++ 知识太老了,我不知道细节。
【解决方案3】:

为什么不是 C99 复合文字?

- (float[2])fooX:(float)x andY:(float)y
{
    return (float[2]){ x, y };
}

【讨论】:

  • 这仍然给出了“数组初始值设定项必须是初始值设定项列表”错误
  • @michaellindahl No, it doesn't.
  • 初始化 C 数组时会这样做。
  • @AminNegm-Awad 平台、编译器、编译器标志等...?
  • Mac OS – clang/LLVM – 标准 您将 retval 分配给一个指针,而不是一个数组。这就是我想在回答中说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2019-01-25
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多