Typedef不作为参数工作或在Arduino sketch函数中返回

时间:2014-06-16 21:36:19

标签: c arduino typedef

我试图在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环境中工作。

2 个答案:

答案 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。