当我试图在函数中返回此数组时,为什么会出现错误“数组初始值设定项必须是初始化列表”?

时间:2014-01-05 21:21:38

标签: objective-c arrays xcode initialization

我来自Java,我对Objective C很新。无论如何,我有这个静态方法,旨在制作一个数组的副本 (如果有的话)更好的方法来实现这一点,请让我知道,但我更多地问这个问题,以便找出我为什么会遇到这个错误,以及如何在将来避免这样的错误。)我遇到了一些问题有了它,但就在我认为我把它们全部整理好的时候,我得到的这个错误看起来像XCode http://i43.tinypic.com/35nal3n.png

以下是界面中的方法:

+ (float[]) copyArray: (float[]) array withLength: (int) length;

以下是实施中的方法:

+ (float[]) copyArray: (float[]) array withLength: (int) length
{
    float copiedArray[length];
    for (int i = 0; i < length; i++)
    {
        copiedArray[i] = array[i];
    }
    return copiedArray;
}

5 个答案:

答案 0 :(得分:6)

如果您真正想要的是将第一个 n 元素从一个C数组复制到另一个已存在的数组中,那么最好的方法就是简单地使用{{1 }}:

memcpy

memcpy(targetArray, sourceArray, sizeof(sourceArray[0]) * numElements); 计算数组中类型的字节大小(在您的情况下,它相当于sizeof(sourceArray[0])

答案 1 :(得分:4)

方法/函数不能返回C数组。你应该这样做

+ (void) copyArrayFrom:(float *)array to:(float *)toArray withLength: (unsigned) length
{
    for (int i = 0; i < length; i++)
    {
        toArray [i] = array[i];
    }
}

答案 2 :(得分:2)

C数组比Java数组更棘手。其中一个最大的问题是,在很多情况下,除非您将此信息保存在不同的变量中,否则您不知道C数组的大小。 C FAQ "Arrays and Pointers"列出了很多陷阱,它们也适用于Objective-C。您可能希望特别看到问题6.5。

正如@lwxted已经建议的那样,尽量避免使用C数组,除非你真的知道自己在做什么并确定自己需要它们。 C阵列 NSArray更快,但除非您确定您的阵列确实是使用分析器测量的性能瓶颈,否则您很可能不会注意到任何差异

我强烈建议避免使用Objective-C对象的C数组(id objects[]),除非你真的,非常清楚你正在做什么(内存管理问题)。

答案 3 :(得分:1)

在Objective-C中,除非有特殊需要,否则更好的方法是使用NSArray而不是C数组。

[NSArray arrayWithArray: array];

将复制array

此外,在这种情况下,如果您坚持使用C数组,建议使用隐式类型长度float[]。更好的方法是使用指针来操作数组。

此外,堆栈分配的数组在离开函数后将无效,因为它仅在copyArray函数的范围内是本地的。如果希望数组在范围之外有效,则应动态分配内存。

答案 4 :(得分:1)

虽然我同意@DarkDust提出的所有要点,但如果您使用的是OpenGL等C API,可能会出现使用NSArrayNSNumber与C类型数组的情况float会对效果产生影响。与往常一样,首先尝试使用更简单的方法,并在决定优化之前仔细测量性能。

在任何情况下,要回答原始问题,这里是如何正确返回C数组的副本:

+ (float *)copyOfCArray:(float *)array withLength:(int)length
{
    float *copyOfArray = malloc(length * sizeof(float));

    for (int i = 0; i < length; i++) {
        copyOfArray[i] = array[i];
    }

    return copyOfArray;
}

此外,可以说根本不需要制作上述方法。相反,考虑将其编写为C函数:

float *CopyArray(float *array, int length)
{
    // Implementation would be the same...
}