0

プログラムでこのエラーが発生する理由がわかりません。この関数は、配列内のすべての数値を合計し、平均を求めることを想定しています。現在、要素をまとめるのに問題があります。

float Average(int **array, int n) {
  int sum = 0;
  int i;
  for (i = 0; i < n; i++){
    sum = sum + array[i];
  }
  return sum/n;
}

パラメータarrayはメイン メソッドで動的に割り当てられn、配列のサイズです。

エラーはこの行から発生していますが、理由はわかりません。

sum = sum + array[i];
4

4 に答える 4

5

おそらくこれが必要です:

float Average(int *array, int n) {
  int sum = 0;
  int i;
  for (i = 0; i < n; i++){
    sum = sum + array[i];
  }
  return sum/n;
}

何らかの理由で *array が指す場所を変更したい場合にのみ **array が必要です。

于 2012-08-30T23:01:03.437 に答える
3

これが発生する理由は、配列が二重ポインターであるためです。すなわち。配列の参照:

*array

あなたにこれを与えます:

int *array

これはまだポインターです。

二重ポインターが必要かどうかを検討してください。そうでない場合は、2 回参照する必要があります。

array[1][2]

お役に立てれば。

于 2012-08-30T22:45:38.603 に答える
2

配列は実際には配列の配列 (**) であるため、配列内の各配列の開始仮想メモリ アドレスの平均値を計算しています。

コンパイラはそれを伝えようとしているだけであり、ほとんどの場合、これはプログラマが望む結果ではありません。ポインター値が 32 ビット整数より大きい場合も、変換が失敗する可能性があります。

キャストは、私がやっていることについて確信があることをコンパイラに伝えます:

(int)array[i]

でも、それはあなたが望んでいることではないと思いますよね?

于 2012-08-30T22:45:55.250 に答える
1

ベンは正しいです。配列が単純なリストの場合、これは解決策の例です。

main(int argc, char * argv[])
{
int ia[10] = {3,2,3,4,5,6,7};
float ans = 0;

  ans = Average(ia,7);
  printf("Ans %f\n",ans);
  exit(0);
}

float Average(int *array, int n)
{
int sum = 0;
int i;

  for (i = 0; i < n; i++){
    sum = sum + array[i];
  }
  printf("Calc %d / %d\n",sum,n);
  return (float)sum/n;
}
于 2012-08-30T23:06:34.273 に答える