1

関数の導関数を調べて、あるしきい値よりも大きな勾配を持つポイントを収集するはずの C++ コードが少しあります。問題が発生しているので、どこにでも印刷ステートメントを配置して、何が問題なのかを把握しています。std::cout<< を使用して配列のサイズを出力すると、関数の出力が変更されるという不可解な問題に遭遇しました。コード スニペットは次のとおりです。

int* Tools::findPoi(float* y, int size, float threshold, int width, float step, int* outsize){
int poi[size];
float* derive = derivative(smooth(y,size,width),size, step);
int n = 0;
std::cout<<size<<" data size\n";
for(int i = 0; i<size; i++) {
    if(derive[i] > threshold) {
        poi[n] = i;
        n++;
    }
}

*outsize = n-1;
return poi;
}

コメントアウトされた行「std::count...」がなければ、82 poi が得られます。しかし、コメントアウトするか削除すると、84 poi になります。他に何も変更はありません。この print ステートメントだけです。なぜ、またはどのように出力が変わる可能性があるのか​​ について、私はとても混乱しています。どんな助けでも大歓迎です。

編集:わかりました、実際にはランダムです。変数 n は、実行するたびに異なるため、メモリ内で何か奇妙なことが起こっていると思います。

4

1 に答える 1

2

次の行には重大な問題があります。

return poi;

これは、ローカルオブジェクトのアドレスを返します。関数の最後で範囲外になると、配列は存在しなくなります。素晴らしい説明については、次を参照してください: Can a local variable's memory be access outside its scope? .

これはC++動的配列が必要なため、 を使用することをお勧めしますstd::vector。このような多くの問題を解決します。

于 2013-07-10T17:36:21.060 に答える