我试图在Arduino ide中做一个链表。
代码如下:
typedef struct ll{
struct ll * prev;
unsigned int currTime;
unsigned int stopTime;
struct ll * next;
} TIMING;
TIMING * head;
TIMING * current;
void setup();
void add_new_first(int stopTimer, TIMING * head);
void main() {
init();
setup();
// Code that uses the def
head->prev = NULL;
head->next = NULL;
head->currTime = 0;
head->stopTime = 200;
}
最后还有实际的功能代码。
这个例子给出了错误:
service_timer_cpp.cpp:5:34:错误:'TIMING'尚未声明。
当不使用定义的类型作为参数或从函数返回时,它可以正常工作。
这就是我认为可以在c中完成并且早些时候对我有用的方式。我不明白为什么它不能在Arduino环境中工作。
答案 0 :(得分:5)
根据one of our fellow Adruino developers,预处理器的工作方式与常规C的工作方式不同。在编译过程中会有一些代码生成,这在http://arduino.cc/en/Hacking/BuildProcess中有详细解释:
转换为主草图文件
Arduino环境会对您的主要进行一些转换 草图文件(草图中所有选项卡的串联,没有 在将其传递给avr-gcc编译器之前。首先,#include " Arduino.h",或者对于小于1.0的版本,#include" WProgram.h"是 添加到草图的顶部。这个头文件(找到 / hardware / cores //)包括所需的所有定义 对于标准的Arduino核心。
接下来,环境在主草图文件中搜索函数定义,并为它们创建声明(原型)。这些 在任何注释或预处理器语句之后插入(#includes 或#defines),但在任何其他陈述之前(包括类型 声明)。这意味着如果要将自定义类型用作 函数参数,您应该在单独的标头中声明它 文件。此外,这一代并不完美:它不会创造 具有默认参数值的函数的原型,或者哪些 在命名空间或类中声明。
最后,当前目标的main.cxx文件的内容是 附加到草图的底部。
这就是为什么struct ll
作为一种类型工作正常(不需要typedef)的原因,但是typedef导致代码中的编译错误,你看不到。
答案 1 :(得分:0)
我没有使用Arduino,但你没有为你制作的两个TIMING指针所需的空间。如果我将head = malloc(sizeof(TIMING)); current = malloc(sizeof(TIMING));
添加到您的主广告(并删除init()
和setup()
)。
不要忘记#includes
因为malloc需要stdlib。