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;
}
戻り値は、関数を呼び出してその関数の結果を他のものに代入する場合にのみ重要です。 'void 'を印刷するだけならいいです。 –
*「まず第一に、正しく理解すれば、double *は引数が動的に定義されることを意味します」*いいえ、パラメータがポインタであることを意味します。それは何を指しているかについて何も言わない。しかし、あなたはおそらくポインタからいくつかの変数を設定しないで、平均とrmsを返す必要があります。 – juanchopanza
@EliSadoffご意見ありがとうございます!実際、私は出力を印刷するだけではいけません。後の計算に出力を使用したいと思います! – Thanos