0

これをやりたいのですが、うまくいきません。それを行うことは可能ですか、それともAをダブルポインターフロート**として宣言する必要がありますか?関数の引数を変更できないように、さまざまな配列の次元に対応するユニバーサル関数が必要であることに注意してください。

void func(float** arr, int x, int y){
    //access to arr[0][0] for e.g. causes SEGFAULT
}
...
float A[2][2]={{1,0},{0,1}};
func(A, 2, 2);
4

5 に答える 5

2

2D配列を関数に渡すには、コンパイル時に少なくとも2次元の要素数を知る必要があります。

void func(float arr[][2], int n)

コンパイル時の配列のサイズがわからない場合は、次のことを除いてできることはほとんどありません。

void func(float *arr, int n, int m)
{
    // getting arr[i][j] with arr[i*m + j]
}

float A[2][2]={{1,0},{0,1}};
func(&A[0][0], 2, 2);
于 2012-08-09T07:49:51.220 に答える
1

の宣言を次のように変更func()します。

void func(float arr[2][2], int x, int y)
{
}

詳細については、次の回答を参照してください:Cの関数で2D配列(行列)を渡す方法は?

于 2012-08-09T07:41:34.630 に答える
1

2次元配列は。と同等ではありません**。原則として、間接参照の1つの「レイヤー」を削除して、それを。に置き換えることができ[]ます。したがって、のようなものfloat *A[]はと同等float **Aです。サイズが定義されていない配列ディメンションを1つだけ持つこともできることに注意してください。したがってfloat[2][]、大丈夫ですが、そうでfloat[][]はありません。

funcをまたはのようなものに変更する必要がありvoid func(float *arr[2], ...)ますvoid func(float arr[2][], ...)

于 2012-08-09T07:43:52.180 に答える
1

一般性が懸念事項である場合は、次のように機能させる必要があります。

 void func(int** arr, int x, int y)
{
}

int main()
{
  int rows, cols, i;
  int **arr;

  arr = (int**)malloc(rows * sizeof(int*));
  for (i=0; i<rows; i++)
  {
    arr[i] = (int*)malloc(cols * sizeof(int));
  }
  arr[0][0]=1;arr[1][0]=0;arr[0][1]=0;arr[0][1]=1;
  func(arr, rows, cols);

  for (i=0; i<rows; i++)
  {
    free(arr[i]);
  }
  free(arr);
}
于 2012-08-09T07:52:40.010 に答える
1

C99以降の最新のCコンパイラを使用している場合は、次のようにすることができます。

void func(size_t x, size_t y, float arr[x][y]) {
 // something using arr[i][j] naturally
}

唯一の制限は、パラメータリストで使用する前にサイズを指定する必要があることです。

呼び出し側では、次のようなものを使用して、動的マトリックスをauto変数として割り当てないようにすることができます。

float (*A)[x0] = malloc(sizeof(float[x0][y0]);
...
func(x0, y0, A);
...
free(A)
于 2012-08-09T07:53:32.900 に答える