0

私はC++の新人ですが、テンプレート関数を作成したいと思います。テンプレートの戻り値に関する問題が発生しました。コードはこんな感じ

#include <iostream>
#include <cmath>
#include <gsl/gsl_rng.h>
#define pi 3.1415926535

using namespace std;


template <class T>
T cpradius(T a,T b,T p, int n)
{

    const gsl_rng_type *R;
    gsl_rng *r;

    gsl_rng_env_setup();
    R = gsl_rng_default;
    r = gsl_rng_alloc(R);

    T p1[n],p3[n],p2 ;
    T radius[n] ;
    for (int i = 0; i<n; i++)
    {
        p1[i] = gsl_rng_uniform(r);
        p2 += p1[i];
    }

    for (int j = 0; j<n; j++)
    {
        p3[j] = p1[j]/p2;
        radius[j] = sqrt(p3[j]*a*b*p/pi);
        //cout <<  radius[j] << endl; 
    }

    return radius[n];
}

int main(){

    double r[30] = {0};
    r[30] = cpradius(30.0,30.0,0.6,30);
    for (int i = 0;i<30;i++){
        cout << r[i] <<endl;
    }
    return 0;
}

次に、それをコンパイルします。

g++ -Wall -I/usr/local/include/ tst3.cpp -lgsl -lgslcblas

結果は1列、30ゼロです:

0
0
0
...
0

最初の配列が更新されていないようですが、誰か助けてくれますか?ありがとう!

4

1 に答える 1

2

これはテンプレートとは何の関係もありません。30個の要素を持つ配列には、0..29の要素があります。r[30]立ち入り禁止の物を保管します。

さらに、非定数の長さ(p1、p3、およびradius)の配列を作成していますが、これは有効なC++ではありません。戻り値から、30個の値を含む配列全体を返したいと思います。あなたがしていることは、31番目(!)の値を返すことです。または、少なくともにアクセスしてみますresult[n]。これは未定義の動作です。つまり、何も起こらない、クラッシュ、予想されること、住所へのオンラインピザ注文などです。

C++配列とその処理方法についての基本的な理解がまだ必要なようです。

PS: 最初のヒントとして、std::vector可変長配列を処理するC ++の方法であるため、探しているものが正確かもしれません。

PS2:#define定数に は使用しないでください。代わりに、固定タイプの定数変数を使用してください。害を及ぼすことはありませんが、面倒なデバッグを省くことができます。

于 2013-02-21T14:40:06.420 に答える