2016-07-07 47 views
-1

我正在尝试创建一个简单的输入来模拟实时时钟值。我希望代码所做的是计算两个tm结构之间的时间差(Time1Start和Time1End)。 month, day, year, etc并不重要,因为这些计算是假定在同一天完成的。
我认为假设小时和分钟是在1900年的第一天,因为它尚未初始化,这是正确的。tm struct和MPLABX x8编译器

一旦我尝试操作任何一个结构,我就会收到警告和一些错误。代码如下:

#include <time.h> 

struct tm Time1Start;  
Time1Start.tm_hour = 0; //start of day - errors start here (line 38) 
Time1Start.tm_min = 0; 

struct tm Time1End; 
Time1End.tm_hour = 17; //5:XX o'clock 
Time1End.tm_min = 30; //5:30 

double seconds; 
double minutes; 
seconds = difftime(mktime(Time1Start), mktime(Time1End)); 
minutes = seconds/60; 

我收到的错误是:

build.h:38: warning: (374) missing basic type; int assumed 

build.h:38: error: (984) type redeclared 

build.h:38: error: (1098) conflicting declarations for variable "Time1Start" (build.h:37) 

我在MPLAB X IDE v3.30使用X8 compiler运行。
请帮忙

+0

假设这是'build.h',(参见[mcve])为什么要在函数外实例化变量?请注意,不允许调用函数外部的函数。 – KevinDTimm

+0

函数作用域内的发布代码是什么? – LPs

+0

请提供[mcve]。显示的代码片段不能编译。 – Olaf

回答

0

你不能在函数之外有一般的语句,你需要在你的main函数或其他一些初始化函数中设置结构成员。

因此,代码应该不是这个样子:

#include <time.h> 

struct tm Time1Start;  
struct tm Time1End; 

double seconds; 
double minutes; 

int main(void) 
{ 
    Time1Start.tm_hour = 0; //start of day - errors start here (line 38) 
    Time1Start.tm_min = 0; 

    Time1End.tm_hour = 17; //5:XX o'clock 
    Time1End.tm_min = 30; //5:30 

    seconds = difftime(mktime(Time1Start), mktime(Time1End)); 
    minutes = seconds/60; 

    // Rest of the main function code... 

    return 0; 
} 

与此相关的,除非变量是由不同的功能使用,不能作为参数传递给那些函数,那么就不要使用全局变量,而是将变量定义为main函数内的局部变量。或者,如果它们仅用于另一个函数,则将其声明为使用它们的函数内的局部变量。

请注意,上述应在源文件。如果你想或者需要这些变量实际上是全局变量,那么你应该把声明放在你包含在需要变量的源文件中的头文件中。该头文件可能看起来像

// First an include guard (https://en.wikipedia.org/wiki/Include_guard) 
#ifndef BUILD_H 
#define BUILD_H 

#include <time.h> 

extern struct tm Time1Start;  
extern struct tm Time1End; 

extern double seconds; 
extern double minutes; 

#endif // BUILD_H 

extern关键字是什么使这些一声明的变量,而不是定义。它基本上告诉编译器“这个变量是在某个地方定义的,可以使用它”。


至于该错误消息,较老的标准允许在没有显式类型中定义的变量,并且然后将它们隐式声明为int C语言的,所以不是例如

int some_variable = 5; 

它曾经是足有

some_variable = 5; 

现在的第一个警告消息告诉你,你缺少的类型,这种隐含int声明完成。然后你得到一个错误,因为这个变量已经使用不同的类型声明了。

+0

不是downvoter,但我认为你可能是错的。但是,在函数之外调用函数几乎肯定会失败。 – KevinDTimm

+0

@KevinDTimm在全球范围内,任何功能外,你只能申报物品,定义的东西,仅此而已。你不能拥有分配或其他表达式之类的语句。 –

+0

谢谢;重读你的答案后,我看到我的第一条评论无效。谢谢。 – KevinDTimm