2013-02-21 2 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]'은 정의되지 않은 동작을 호출합니다. –

답변

2

이것은 템플릿과 관련이 없습니다. 30 개의 원소를 갖는 배열은 0..29의 indizes에 원소를 갖는다. 당신은 무제한 인 r[30]에 무엇인가를 저장합니다.

또한 비 유효 길이 (p1, p3 및 반경)의 배열을 생성하고 있으며 이는 유효한 C++가 아닙니다. 귀하의 반환에서 나는 당신이 30 개의 값을 포함하는 전체 배열을 반환하려는 것으로 가정합니다. 31 번째 (!) 값을 반환하거나 적어도 result[n]에 액세스하여 시도하고 있습니다. 이것은 아무런 일도 일어나지 않을 것입니다 : 아무것도, 충돌, 예상 할 수있는 것, 온라인 피자 주문 ...

C++ 배열에 대한 기본적인 이해가 필요합니다. 그들.

PS : 첫 번째 힌트로 , std::vector는 가변 길이 배열을 처리 할 수있는 C++ 방법이기 때문에 당신이 찾고있는 무슨 exaclty 수 있습니다.

PS2 : 상수에는 #define을 사용하지 마십시오. 고정 유형의 상수 변수를 대신 사용하십시오. 결코 해를 끼치 지 않지만 때로는 고통스러운 디버깅을 저장합니다.

+0

감사합니다, 친구, 네, 여행 할 길은 lonnnnnnnnnnnn 것 같습니다. 저는 여러분이 MATLAB에서 C++로 바꾸는 사람을 이미지 할 수 있다고 생각합니다. 그러나 여전히 C++로 작업하고 싶습니다. 이야기하기를 좋아하며 다시 감사드립니다! – Kylxyz

+0

아마도 그렇게 오래 걸리지 않을 것입니다. 비슷한 코드가 약간 다른 구문과 아주 다른 의미를 가지고있을뿐입니다. 당신이하려고하는 것들이 마스터하기가 그렇게 어렵지는 않습니다 :-) 행운을 빌어 요! –