-2

C 関数について困っています。

これは機能です:

int* CalcMeanPower(int Media[], int** MeanPowerArray, int righe, int colonne)
{
  int i=0, k=0;
  int ArrayPower[] = {0, 0, 0, 0};

  for (i=0; i<righe; i++)
  {
    for (k=0; k<colonne; k++)
    {
      ArrayPower[k] = ArrayPower[k] + MeanPowerArray[i][k]  ;
    }
  }

  for (k=0; k<colonne; k++)
  {
    Media[k] = (ArrayPower[k]/righe);
  }

  return Media;
}

これは、メインから関数を呼び出す方法です。

VettoreMedia = CalcMeanPower(VettoreMedia, RefMeanPower, num_mean, N);

変数は次のように定義されます。

int* RefMeanPower[N];
int* VettoreMedia;
int N=4, num_mean=5;

プログラムを実行しようとすると、実行しようとしているときにセグメンテーション違反が返されます。

 for (k=0; k<colonne; k++)
  {
    Media[k] = (ArrayPower[k]/righe);
  }

私が間違っていることを説明していただけますか?ネットで調べてみましたが、答えが見つかりません。この関数は私の C プログラムのほんの一部にすぎませんが、このサイクルで失敗することは間違いありません!

助けてください..

4

3 に答える 3

1

関数に渡す前にVetorreMediaを初期化していません。これは初期化されていないため、メディアも不明な場所を指しているため、セグメンテーション違反が発生します。VetorreMediaにはデフォルト値が必要です。

于 2013-02-18T16:54:24.473 に答える
0

変数/配列用にメモリを予約する必要があります。

RefMeanPower単なる初期化されていないポインタの配列です。そしてVettoreMedia、単なる初期化されていないポインタです。

for(int i = 0; i < N; ++i)
  RefMeanPower[i] = malloc(sizeof(int) * num_mean);

// don't forget to free after usage
for(int i = 0; i < N; ++i)
  free(RefMeanPower[i]);

あなたがRefMeanPower[N][num_mean]そう交換するところk、そしてiインデックスとして、またはN作成num_mean時に。

そしてVettoreMediaあなたのためにできる

VettoreMedia = malloc(sizeof(int) * N);

// don't forget to free after usage
free(VettoreMedia);

また

int VettoreMedia[N];
// frees automatically when leaving scope
于 2013-02-18T16:55:59.013 に答える
0

これをデバッガーで実行すると、segfault が発生している場所が表示され、そこから解決できるようになります。

Googlegdb cheatsheetで始めましょう。

于 2013-02-18T16:55:36.333 に答える