Arduino: struct pointer как параметр функции

Вопрос:

Код ниже дает ошибку:

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

Лучший ответ:

Проблема в том, что 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 до того, как Struc известен компилятору 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

Ответ выше работает. Тем временем я нашел следующее также для работы без необходимости файла.h:

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

void func(struct MyStruc *p) {  }

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

void loop()
{
}

Будьте осторожны: кодировка Arduino немного шелушащаяся. Многие из библиотек также немного шелушатся!

Ответ №2

Этот следующий код работает для меня, как в 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

Простые старые новости, но 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));
}

Оцените статью
TechArks.Ru
Добавить комментарий