Функция возврата шаблона

Я новичок в 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

кажется первоначальный массив не обновлен, кто-нибудь мне помогает? благодарю вас!

0

Решение

Это не имеет ничего общего с шаблонами. Массив из 30 элементов имеет элементы с индексами 0..29. Вы храните что-то в r[30] что запрещено.

Кроме того, вы создаете массивы неконстантной длины (p1, p3 и radius), что недопустимо в C ++. Из вашего возврата я предполагаю, что вы хотите вернуть весь массив, содержащий 30 значений. То, что вы делаете, возвращает 31-е (!) Значение, или, по крайней мере, вы пытаетесь получить доступ к result[n], Это неопределенное поведение, означающее, что все может случиться: ничего, сбой, все, что вы ожидаете, заказ пиццы онлайн на ваш адрес …

Кажется, вам все еще нужно некоторое базовое понимание массивов C ++ и того, как с ними обращаться.

PS:
Как первый намек, std::vector может быть именно то, что вы ищете, так как это способ C ++ для обработки массивов переменной длины.

PS2:
Не использовать #define для постоянных. Вместо этого используйте постоянные переменные фиксированного типа. Это никогда не повредит, но иногда избавит вас от болезненной отладки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]