0

私は単純なソフトモデムプログラムに取り組んでいます。モデムは、ダイヤルアップ モデムのオーディオ FSK を実装するように設計されており、DTMF トーンを発することによって電話を開始できる必要があります。現在、正弦値を生成する関数に問題があります。

 double* generate_sine( int numberOfElements, double amplitude, 
 double phase_in_degrees, double numberOfCycles)
{
static int i;

double *sine_output;
sine_output = malloc( numberOfElements*sizeof(double) ); 

for( i=0; i<numberOfElements; i++ )
{

     sine_output[i] = (amplitude*sin(( (2.0*M_PI*i*numberOfCycles)/(double)numberOfElements )+
     ((M_PI*phase_in_degrees)/180 )));

   }
return sine_output; 
}

関数にセグメンテーション エラーがあります。変数 "i" は、ループの最初の繰り返しの後、ポインターになるように見えます。その値は 4206692 です。sine_ptr も、ループの 2 回目の繰り返しで 0 (NULL) になるまで有効なアドレスを持ちます。ここで関数が呼び出されます。デフォルト_フェーズ = 0.0

int main()
{
 int i;
     int numElements = 10;
 double* sine_ptr = generate_sine( numElements, 0.5, DEFAULT_PHASE, 440 );

  for( i=0; i<numElements; i++)
  {
    printf( "%e \n", *(sine_ptr + i ) );
  }
 free(sine_ptr);
 return 0;
}

提案されたすべての編集を考慮した後、コードの問題を解決することができました。あなたがくれた助けに感謝します。

4

1 に答える 1

3

EDIT別のポイントを追加しました。

問題番号1

5 つの要素に十分なメモリを割り当てています (numberOfElements は 5)。次に、最初の点から 10 個の要素を印刷しようとしています。最後の 5 つの要素は未割り当て領域にアクセスし、未定義の動作を引き起こす可能性があります。セグメンテーション違反を含みます。

問題番号 2

割り当てられたスペースへのポインターを解放するのではなく、10 桁後の場所を解放します。これにより、セグメンテーション違反を解決すると、他の問題も発生します。

問題番号 3

これはマイナーなものの1つです。しかし、sine_ptr はdoubleであり、それを未定義として表示しようとしてintいます。コンパイラの警告が発生します。警告があっても、数値はダウンキャストされます。あなたの場合、出力はすべてゼロになります。正しい結果を表示するには、 を使用します%lf

次のコードを使用します。

int main()
{
  int i;
  int numElements = 5;
  double* sine_ptr = generate_sine( numElements, 0.5, DEFAULT_PHASE, 440 );
   for( i=0; i<numElements; i++)
   {
     printf( "%lf \n", *(sine_ptr + i) );
   }
   free(sine_ptr);
   return 0;
}
于 2013-01-05T07:14:43.833 に答える