我正在尝试创建一个简单的输入来模拟实时时钟值。我想要的代码就是计算两个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.30
在X8 compiler
中投放。
请帮助
答案 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
声明已完成。然后你得到一个错误,因为变量已经使用不同的类型声明了。