0

2D 配列を渡した後、関数から 2D 配列を返そうとしています。これは私が得た距離ですが、まだ大量のコンパイルエラーが発生しています。エラーの意味を調べてみましたが、まだ信じられないほど混乱しています。値の配列を 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]

また、前の関数を 2 回呼び出して配列を 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]
4

2 に答える 2

2

arrayですchar *。です。array[rowCount]_ charさらにどのように下付きにするつもりですか?

2D 配列が必要な場合は、おそらく配列へのポインターを関数に渡す必要があります。

同じく、

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

これも間違っています。関数から返されたときにreturnArray2減衰するchar (*)[columnCount]ため、戻り値の型も変更する必要があります。

(そして、他の人が指摘したように、自動保存期間を持つ配列を返すと UB が呼び出されます。代わりにメモリを動的に割り当てるか、別の配列をその場で変更する関数に渡す必要があります。)

于 2013-07-21T05:58:22.057 に答える
0

まず第一に、C では配列を値で返すことはできません。もちろん、それらをパラメーターとして渡すことはできますが、複数の次元の配列では、最初の次元以外のすべてのサイズを指定する必要があることを覚えておいてください。

ただし、ヒープに多次元配列 (つまり、配列へのポインターの配列) を割り当てることができます。これは関数から返され、「単純な」パラメーターとして渡されます (動的な 2 次元配列は char** / char*[ として渡されます)。 ])、しかし、メモリの所有権を適切に委譲するように細心の注意を払う必要があります。そうしないと、メモリ リークが発生します。

私の個人的な好みは、構造を使用して後者をディメンション情報とともにカプセル化することです。

ああ、もう 1 つ:

char *returnArray[columnCount][rowCount];

上記はポインターの 2 次元配列であり、ここで必要なものではありません...

于 2013-07-21T06:37:52.097 に答える