2011-05-02 137 views
2

我寫了這段代碼,有一個問題,我似乎無法解決。該函數應該返回T1並從主中返回,但它總是給我一個錯誤「T1 is undeclared identifier」。爲什麼?無法從函數返回值?

#include<iostream> 
#include<math.h> 
#include<time.h> 
using namespace std; 
double factorial() 
{ 
    int i; 
    double T1,total=0; 
    for(i=0;i<200;i++) 
    { 
     clock_t start = clock(); 

     int a,N,f; 
    N=99999; 
     f=N; 
    for(a=N-1;a>0;a--) 
    { 
     f=f*a; 
     } 

     clock_t end = clock(); 
     T1=double(end-start)/(double) CLOCKS_PER_SEC; 
     total=total+T1; 
    } 
    T1=total/200; 
    return T1; 
} 
int main() 
{ 
    factorial(); 
    cout<<T1<<endl; 

    return 0; 
} 

回答

1

您必須首先在本地定義T1或將其設置爲全局變量(不推薦)。

int main() 
{ 
double T1=factorial(); 

cout<<T1<<endl; 

return 0; 
} 
+1

它運行,但給出了一個錯誤的答案,它給0 ,,我用double而不是int它給出了完全不同的答案,它應該是0.00116,但它是0.00177 – Anon 2011-05-02 02:45:54

+0

@Anon:爲什麼0是錯誤的答案?你的電腦速度相當快,你只做了幾千次乘法。或者,編譯器只是將它們完全優化。 – 2011-05-02 02:51:27

+0

這應該是你的'factorial()'函數的一個問題。你的問題是關於編譯錯誤,這聽起來像用上面的代碼修復了。 – CoolBeans 2011-05-02 02:52:48

3

每個函數只知道它的局部變量(和全局變量,你沒有任何定義)。你必須爲主結果創建一個變量:

int main() 
{ 
    double answer = factorial(); 
    cout << answer << endl; 

    return 0; 
} 

我不知道你是否在意,但階乘值會溢出。

+0

它不會溢出的執行時間出來罰款 – Anon 2011-05-02 02:51:29

+0

執行時間會很好(除非你有一個痛苦的慢計算機:-)),但實際計算爲階乘「f」的數字將溢出。 – Jess 2011-05-02 02:53:20

+1

啊是的,但事情是,如果我使用了一個像10這樣的小數字,它給出了一個零的執行時間,所以我不得不使用一個大數字,你認爲怎麼樣? – Anon 2011-05-02 02:55:18

3

由於T1沒有在主()範圍下定義,所以僅在您的函數階乘的範圍內定義。

你應該這樣做,而不是:

cout<<factorial()<<endl; 

或您主要函數中定義T1是這樣的:

double T1 = factorial(); 
cout<<T1<<endl; 
+1

是正常的,答案有點改變,是否與時鐘週期 – Anon 2011-05-02 02:50:00

+0

做得很好,因爲T1的值取決於返回的值「時鐘」,那麼我會懷疑每個程序的執行結果都會改變。 – 2011-05-02 02:52:34

+1

所以它的正常感謝 – Anon 2011-05-02 02:57:10