繁体   English   中英

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

[英]Why do I get the error “Array initializer must be an initializer list” when I'm trying to return this array in a function?

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

这是界面中的方法:

+ (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;
}

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

memcpy(targetArray, sourceArray, sizeof(sourceArray[0]) * numElements);

sizeof(sourceArray[0])计算数组中类型的字节大小(在您的情况下,它等于sizeof(float)

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

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

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

正如@lwxted已经建议的那样,尽量避免使用C数组,除非你真的知道自己在做什么并确定自己需要它们。 C数组快于NSArray ,但除非你已经确定你真的阵是你很可能不会注意到任何区别探查测量性能瓶颈。

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

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

[NSArray arrayWithArray: array];

将复制一个array

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

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

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

无论如何,要回答原始问题,这里是如何正确返回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...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM