2013-02-21 75 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數組的非常量長度(p1,p3和radius),這不是有效的C++。從你的回報中,我假設你想返回包含30個值的整個數組。你所做的就是返回第31個(!)值,或者至少通過訪問result[n]來嘗試。這是不確定的行爲,這意味着任何事情都可能發生:沒有什麼,崩潰,任何你可能期望的,在你的地址上的在線披薩訂單...

看來你仍然需要一些關於C++數組的基本理解以及如何處理他們。

PS: 作爲第一個暗示,std::vector可能是exaclty你正在尋找的東西,因爲它是C++的方式來處理變長數組。

PS2: 不要使用#define作爲常量。改爲使用固定類型的常量變量。它永遠不會受到傷害,但有時會節省您一些痛苦的調試。

+0

謝謝你,哥們,是的,我似乎有一種寂寞的旅行方式。我認爲你可以用MATLAB來形象地轉向C++,但是,我仍然想用C++來工作,很高興能夠交談,再次感謝你! – Kylxyz 2013-02-21 15:18:08

+0

也許不會那麼長 - 只是相似的代碼有不同的語法和非常不同的語義。你試圖做的事情並不難以掌握:-)祝你好運! – 2013-02-21 15:42:28