2011-05-02 119 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