我是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
似乎初始数组没有更新,有人帮我吗?谢谢!
最佳答案
这与模板无关。具有 30 个元素的数组在索引 0..29 处有元素。你在 r[30]
中存储了一些东西,这是禁止访问的。
此外,您正在创建非常量长度(p1、p3 和半径)的数组,这在 C++ 中是无效的。从你的返回我假设你想返回整个数组,包含 30 个值。您正在做的是返回第 31 个 (!) 值,或者至少您尝试访问 result[n]
。这是未定义的行为,意味着任何事情都可能发生:什么都没有,崩溃,任何你可能想到的事情,在线比萨饼订单到你的地址......
看来您仍然需要对 C++ 数组以及如何处理它们有一些基本的了解。
附言:
作为第一个提示,std::vector
可能正是您正在寻找的东西,因为它是处理可变长度数组的 C++ 方式。
PS2:
不要对常量使用#define
。请改用固定类型的常量变量。它永远不会造成伤害,但有时会为您省去一些痛苦的调试。
关于c++ - 模板函数返回问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15004923/