2013-07-21 72 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]; 

以上是指针,这是不是你想要的这里的二维数组...

相关问题