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 个元素的数组在 indizes 0..29 处具有元素。你存储一些r[30]不受限制的东西。

此外,您正在创建非常量长度(p1、p3 和半径)的数组,这不是有效的 C++。从您的返回中,我假设您要返回包含 30 个值的整个数组。您正在做的是返回第 31 个(!)值,或者至少您尝试通过访问result[n]. 这是未定义的行为,意味着任何事情都可能发生:什么都没有,崩溃,任何您可能期望的事情,在线披萨订单到您的地址......

看来您仍然需要对 C++ 数组以及如何处理它们有一些基本的了解。

PS: 作为第一个提示,std::vector可能正是您正在寻找的东西,因为它是处理可变长度数组的 C++ 方式。

PS2: 不要#define用于常量。请改用固定类型的常量变量。它永远不会受到伤害,但有时会为您节省一些痛苦的调试。

于 2013-02-21T14:40:06.420 回答