2013-07-05 56 views
1

下面的代码提供了错误:的Arduino:结构指针作为函数参数

sketch_jul05a:2: error: variable or field 'func' declared void 

所以我的问题是:我怎么能传递一个指向结构作为函数参数?

代码:

typedef struct 
{ int a,b; 
} Struc; 


void func(Struc *p) { } 

void setup() { 
    Struc s; 
    func(&s); 
} 

void loop() 
{ 
} 

回答

5

的问题是,是,Arduino的IDE自动翻译成这样的C本:

#line 1 "sketch_jul05a.ino" 
#include "Arduino.h" 
void func(Struc *p); 
void setup(); 
void loop(); 
#line 1 
typedef struct 
{ int a,b; 
} Struc; 


void func(Struc *p) { } 

void setup() { 
    Struc s; 
    func(&s); 
} 

void loop() 
{ 
} 

这意味着Strucfunc声明使用Struc前是C编译器已知的。

解决方案:将Struc的定义移动到另一个头文件并包含它。

主要小品:

#include "datastructures.h" 

void func(Struc *p) { } 

void setup() { 
    Struc s; 
    func(&s); 
} 

void loop() 
{ 
} 

datastructures.h

struct Struc 
{ int a,b; 
}; 
0

上述工程的答案。在此期间我发现下面还工作,而不需要.h文件:

typedef struct MyStruc 
{ int a,b; 
} Struc; 

void func(struct MyStruc *p) { } 

void setup() { 
    Struc s; 
    func(&s); 
} 

void loop() 
{ 
} 

被警告:Arduino的编码是有点片状。许多图书馆也有点片!

0

这下面的代码对我的作品在Arduino的1.6.3:

typedef struct S 
{ 
    int a; 
}S; 

void f(S * s, int v); 



void f(S * s, int v) 
{ 
    s->a = v; 
} 

void setup() { 
} 

void loop() { 
    S anObject; 
    // I hate global variables 

    pinMode(13, OUTPUT); 
    // I hate the "setup()" function 

    f(&anObject, 0); 
    // I love ADTs 

    while (1) // I hate the "loop" mechanism 
    { 
     // do something 
    } 
} 
0

Prolly旧闻,但typedef struct允许成员函数(至少在IDE 1.6.4)。当然,这取决于你想要做什么,但我想不出还有object.func(param pdata)也无法处理的任何func(struct *p)。就像p->a = 120;变得像object.setA(120);

typedef struct { 
    byte var1; 
    byte var2; 

    void setVar1(byte val){ 
     this->var1=val; 
    } 

    byte getVar1(void) { 
     return this->var1; 
    } 
} wtf; 

wtf testW = {127,15}; 

void initwtf(byte setVal) { 
    testW.setVar1(setVal); 
    Serial.print("Here is an objective returned value: "); 
    Serial.println(testW.getVar1()); 
} 
... 
void loop() { 
    initwtf(random(0,100)); 
}