Arduino:struct指针作为函数参数

时间:2013-07-05 16:33:08

标签: arduino arduino-ide

下面的代码给出了错误:

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()
{
}

4 个答案:

答案 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));
}