簡體   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