2013-07-21 73 views
0

我試圖在傳遞二維數組之後從函數返回二維數組。這是我得到了多少,但我仍然遇到過多的編譯錯誤。我試着搜索錯誤的意思,但我仍然非常困惑。我試圖旋轉90度的值的數組。這裏是我的代碼:錯誤:下標值既不是數組也不是指針也不是矢量

// Rotate Array 90 degrees 
char * Rotate90Array(char *array, int rowCount, int columnCount) { 
    // These have to be swapped because the image is being rotated 
    char *returnArray[columnCount][rowCount]; 
    int u = rowCount - 1; 
    int v = columnCount - 1; 
    int i = 0; 
    int j = 0; 
    for (i = 0; i < rowCount; i++) { 
    for (j = 0; j < columnCount; j++) { 
     returnArray[i][j] = array[u-j][i]; 
     j++; 
    } 
    i++; 
    } 
    return returnArray; 
} 

以下是有關這個功能我的錯誤:

P-MFunctionHolder.c: In function 'Rotate90Array': 
P-MFunctionHolder.c:211:34: error: subscripted value is neither array nor pointer nor vector 
P-MFunctionHolder.c:216:2: warning: return from incompatible pointer type [enabled by default] 
P-MFunctionHolder.c:216:2: warning: function returns address of local variable [enabled by default] 

我也有在前面的一個調用兩次另一個函數,旋轉陣列180度,而這給我類似的錯誤。下面是代碼:

// Rotate Array 180 degrees 
char * Rotate180Array(char *array, int rowCount, int columnCount) { 
    char returnArray1[rowCount][columnCount] = Rotate90Array(array, rowCount, columnCount); 
    char returnArray2[rowCount][columnCount] = Rotate90Array(returnArray1, rowCount, columnCount); 
    return returnArray2; 
} 

下面是有關該功能的錯誤:

P-MFunctionHolder.c: In function 'Rotate180Array': 
P-MFunctionHolder.c:222:2: error: variable-sized object may not be initialized 
P-MFunctionHolder.c:223:2: error: variable-sized object may not be initialized 
P-MFunctionHolder.c:223:2: warning: passing argument 1 of 'Rotate90Array' from incompatible pointer type [enabled by default] 
P-MFunctionHolder.c:199:8: note: expected 'char *' but argument is of type 'char (*)[(sizetype)(columnCount)]' 
P-MFunctionHolder.c:224:2: warning: return from incompatible pointer type [enabled by default] 
P-MFunctionHolder.c:224:2: warning: function returns address of local variable [enabled by default] 

回答

2

arraychar *。所以,array[rowCount]char。你打算如何進一步下標?

如果你需要一個二維數組,你可能應該傳遞一個指向數組的指針。

同樣,

char returnArray2[rowCount][columnCount] = ... 
return returnArray2; 

這是錯誤的也再次returnArray2從函數返回的時候,所以你應該改變返回類型以及衰變爲char (*)[columnCount]

(是的,正如其他指出的,返回一個數組具有自動存儲持續時間調用UB,您應分配內存動態代替或通過另一個陣列其所就地修改功能。)

+0

實際上'returnArray [i] [j] = array [uj] [i];'應該是'returnArray [i] [j] =&array [uj];'我猜。 –

0

首先總之,你不能用C中的值返回數組。你可以將它們作爲參數傳遞,當然,但要記住,對於多維數組,你必須指定除第一維以外的所有大小。

但是,您可以在堆上分配多維數組(即:指向數組的指針數組),它可以從函數返回並作爲「簡單」參數傳遞(動態二維數組將作爲char **傳遞/ char * []),但是您必須非常小心才能正確委託內存的所有權,否則會發生內存泄漏。

我個人的偏好是使用一個結構來封裝後者和維度信息。

哦,還有一兩件事:

char *returnArray[columnCount][rowCount]; 

以上是指針,這是不是你想要的這裏的二維數組...

相關問題