下面的代码给出了错误:
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()
{
}
答案 0 :(得分: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()
{
}
这意味着Struc
的声明在func
之前用于{C}编译器已知Struc
。
解决方案:将Struc
的定义移到另一个头文件中并包含此内容。
主要草图:
#include "datastructures.h"
void func(Struc *p) { }
void setup() {
Struc s;
func(&s);
}
void loop()
{
}
和datastructures.h
:
struct Struc
{ int a,b;
};
答案 1 :(得分:0)
上面的答案有效。与此同时,我发现以下内容也可以工作,而不需要.h文件:
typedef struct MyStruc
{ int a,b;
} Struc;
void func(struct MyStruc *p) { }
void setup() {
Struc s;
func(&s);
}
void loop()
{
}
警告:Arduino编码有点不稳定。许多图书馆也有点不稳定!
答案 2 :(得分: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
}
}
答案 3 :(得分:0)
Prolly旧消息,但typedef struct
允许成员函数(至少在IDE 1.6.4中)。当然,这取决于您想要做什么,但我无法想到func(struct *p)
无法处理的任何object.func(param pdata)
。就像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));
}