【问题标题】:tm struct and MPLABX x8 compilertm 结构和 MPLABX x8 编译器
【发布时间】:2016-07-07 15:15:31
【问题描述】:

我正在尝试创建一个简单的输入来模拟实时时钟值。我想要代码做的就是计算两个 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)

我正在使用X8 compilerMPLAB X IDE v3.30 中运行。
请帮助

【问题讨论】:

  • 假设这是在build.h 中,(请参阅minimal reproducible example)为什么要在函数之外实例化变量?请注意,不允许在函数之外调用函数。
  • 发布的代码是否在函数范围内?
  • 请提供minimal reproducible example。显示的 sn-p 无法编译。

标签: c struct embedded mplab time.h


【解决方案1】:

你不能在函数之外有通用语句,你需要在你的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 函数内的局部变量。或者,如果它们仅在另一个函数中使用,则在使用它们的函数中将它们声明为局部变量。

请注意,以上内容应在源文件中。如果您希望或需要变量实际上是全局的,那么您应该将 declarations 放在一个头文件中,该头文件包含在需要变量的源文件中。该头文件可能看起来像

// 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 声明已完成。然后你会得到一个错误,因为变量已经使用不同的类型声明了。

【讨论】:

  • 不是反对者,但我认为你可能错了。但是,在函数之外调用函数几乎肯定会失败。
  • @KevinDTimm 在全局范围内,在任何函数之外,你只能声明事物,定义事物,仅此而已。你不能有像赋值或其他表达式这样的语句。
  • 谢谢;重读您的答案后,我看到我的第一条评论无效。谢谢。
猜你喜欢
  • 2018-04-18
  • 2017-04-11
  • 2015-04-27
  • 2012-12-07
  • 2017-03-11
  • 2012-04-11
  • 2013-06-23
  • 1970-01-01
  • 2011-02-12
相关资源
最近更新 更多