2016-06-21 7 views
0

C++では、動的割り当てと関連する問題を処理しています。私が正しく理解していれば、私は、信号のすべての戻り値に返される関数は関数から返されません-C++

void FindRMS(int points, double* signal_x, double* signal_y, int presamples, double* mean, double* rms) 
{  
    //double fraction_presamples_RMS = 0.9; // fraction of presamples to calculate RMS 
    //Safety condition 
    if (presamples>points) { 
    printf("\nERROR: Too many presamples!\n\n"); 
    return; 
    } 

    //Main procedure 
    (*rms) =0.; 
    (*mean) =0.; 

    for (int i=0; i<presamples; i++) { 
    (*mean)+=signal_y[i]; 
    (*rms)+=pow(signal_y[i],2); 
    } 

    (*mean)/=presamples; 
    (*rms)=sqrt((*rms)/presamples-pow((*mean),2)); 
    cout << "RMS was found to be : " << (*rms) << endl; 

} 

ファーストのrmsを計算するために、以下の機能を持っている、double* <var>は、引数は、その大きさはによって制限されることを意味し、動的に定義されることが期待されることを意味しハードウェア

次に、私のコードでこの関数を呼び出すことです。サンプルコードは奇妙なことは、プログラムが実行された場合、プログラム終了前に私はそれが実効値を取得しながら、私は、論理的なRMSと機能から、COUTを0

され得るということである以下の

void Analyze(unsigned int first_run, unsigned int last_run, unsigned int last-segment){ 

    int points = 9e6;//hSignal->GetNbinsX(); 
//double x[points], y[points], derivative[points]; // SIZE limited by COMPILER to the size of the stack frame 
    double* x   = new double[points];   // SIZE limited only by OS/Hardware 
    double* y   = new double[points]; 
    double* derivative = new double[points]; 
    double* mean  = new double[points]; 
    double* rms  = new double[points]; 
    for (int i = 0; i < points; i++){ 
     x[i] = hSignal->GetBinLowEdge(i+1); 
     y[i] = hSignal->GetBinContent(i+1); 
     //cout << " Bin Center " << hSignal->GetBinLowEdge(2) << endl; 
    } 
    FindRMS(points, x, y, 0.9*points, mean, rms); 
    delete[] x; 
    delete[] y; 
    delete[] mean; 
    cout << "The value of rms[10] = " << rms[10] << endl; 

} 

です

これがなぜ起こっているかについてのアイデアやアドバイスはありますか?事は、私がdouble*代わりのvoidを返すために機能を変更することを考えたが、何も本当に変わっていない...それは私がに固執する必要がライブラリに属しているので、私は、あるとして機能に固執する必要があること

です。 ...ここでは修正機能

double* FindRMS(int points, double* signal_x, double* signal_y, int presamples, double* mean, double* rms) 
{  
    //double fraction_presamples_RMS = 0.9; // fraction of presamples to calculate RMS 
    //Safety condition 
    if (presamples>points) { 
    printf("\nERROR: Too many presamples!\n\n"); 
    //return; 
    } 

    //Main procedure 
    (*rms) =0.; 
    (*mean) =0.; 

    for (int i=0; i<presamples; i++) { 
    (*mean)+=signal_y[i]; 
    (*rms)+=pow(signal_y[i],2); 
    } 

    (*mean)/=presamples; 
    (*rms)=sqrt((*rms)/presamples-pow((*mean),2)); 
    cout << "RMS was found to be : " << (*rms) << endl; 

    return rms; 

} 
+0

戻り値は、関数を呼び出してその関数の結果を他のものに代入する場合にのみ重要です。 'void 'を印刷するだけならいいです。 –

+2

*「まず第一に、正しく理解すれば、double *は引数が動的に定義されることを意味します」*いいえ、パラメータがポインタであることを意味します。それは何を指しているかについて何も言わない。しかし、あなたはおそらくポインタからいくつかの変数を設定しないで、平均とrmsを返す必要があります。 – juanchopanza

+0

@EliSadoffご意見ありがとうございます!実際、私は出力を印刷するだけではいけません。後の計算に出力を使用したいと思います! – Thanos

答えて

3

はあなただけrms[0]と同じである*rmsを設定FindRMS機能です。配列内の他のすべての値は初期化されていません。つまり、値はであり、不確定値はです(ランダムであるように見えます)。これらの初期化されていない値を読み取ると、の未定義の動作になります。

+0

ありがとうございました!私は以下について混乱しています:関数は 'double * singal_x'と' double * signal_y'を受け取ります。私が理解する限り、これらは 'x [0]'と 'y [0]'です。しかし、関数の内部に 'y []'配列のループがあります! – Thanos

+0

@Thanos:ポインタ 'signal_y'は配列' y'の先頭を指します。 –

+0

@Thanos *ポインタの宣言とポインタの逆参照*には違いがあります。 C++では、多くの演算子と特殊文字が別の状況で異なることを意味する可能性があります。 –

関連する問題