online - arduino programming
Arduino: struct pointer como parámetro de función (4)
El código a continuación da el error:
sketch_jul05a:2: error: variable or field ''func'' declared void
Entonces mi pregunta es: ¿cómo puedo pasar un puntero a una estructura como parámetro de función?
Código:
typedef struct
{ int a,b;
} Struc;
void func(Struc *p) { }
void setup() {
Struc s;
func(&s);
}
void loop()
{
}
El problema es que el Arduino-IDE traduce automáticamente esto en C así:
#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()
{
}
Lo que significa que Struc
se usa en la declaración de func
antes de que Struc
sea conocido por el compilador de C.
Solución: Mueva la definición de Struc
a otro archivo de encabezado e Struc
.
Bosquejo principal:
#include "datastructures.h"
void func(Struc *p) { }
void setup() {
Struc s;
func(&s);
}
void loop()
{
}
y datastructures.h
:
struct Struc
{ int a,b;
};
La respuesta anterior funciona. Mientras tanto, también encontré lo siguiente para trabajar, sin necesidad de un archivo .h:
typedef struct MyStruc
{ int a,b;
} Struc;
void func(struct MyStruc *p) { }
void setup() {
Struc s;
func(&s);
}
void loop()
{
}
Tenga cuidado: la codificación Arduino es un poco escamosa. ¡Muchas de las bibliotecas también son un poco escamosas!
El siguiente código funciona para mí como en 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
}
}
Prolly noticias viejas, pero typedef struct
permite funciones de miembros (al menos en IDE 1.6.4). Dependiendo de lo que quieras hacer, por supuesto, pero no puedo pensar en ningún func(struct *p)
que no pueda manejarse también con object.func(param pdata)
. Solo que algo como p->a = 120;
se convierte en algo así como 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));
}