tm struct和MPLABX x8编译器

时间:2016-07-07 15:15:31

标签: c struct embedded mplab time.h

我正在尝试创建一个简单的输入来模拟实时时钟值。我想要的代码就是计算两个tm结构之间的时间差(Time1Start和Time1End)。 month, day, year, etc并不重要,因为假设这些计算是在同一天进行的。
我认为,假设小时和分钟在1900年的第一天是因为它没有已初始化。

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

#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.30X8 compiler中投放。
请帮助

1 个答案:

答案 0 :(得分: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关键字是变量的声明,而不是定义。它基本上告诉编译器“这个变量是在某个地方定义的,可以使用它”。

对于错误消息,C语言的旧标准允许在没有显式类型的情况下定义变量,然后将它们隐式声明为int,而不是例如。

int some_variable = 5;

过去已经足够了

some_variable = 5;

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