2013-02-21 3 views
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 

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

+0

действительные индексы массива являются '[0, n-1]', поэтому 'radius [n]' и 'r [30]' вызывает неопределенное поведение. – 2013-02-21 14:41:45

ответ

2

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

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

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

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

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

+0

Спасибо, дружище, да, кажется, у меня есть lonnnnnnnnnnnnnnn way to travel. Я думаю, что вы можете изобразить парня, просто превратившегося в C++ из MATLAB, но, тем не менее, я хочу работать с C++, рад поговорить, еще раз поблагодарить u! – Kylxyz

+0

Возможно, это не так долго - это только тот похожий код имеет немного отличающийся синтаксис и очень разную семантику. То, что вы пытаетесь сделать, не так сложно овладеть :-) Удачи! –

Смежные вопросы