Hola, lo que quiero hacer es utilizar los datos de una estructura que se encuentra definida en otra librería. Por ejemplo, tengo el archivo .ino y dos librerías: a.h, a.cpp , b.h y b.cpp. (Esto es un ejemplo de lo que quiero hacer con mi programa, que no copio aquí por ser muy extenso)
En a.h tengo definida una estructura de la siguiente forma:
#ifndef a_h
#define a_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
struct data
{
int l;
uint8_t x;
unsigned char *ptrData;
struct data *nextElement;
};
class a{
public:
struct data *primero;
struct data *ultimo;
int rellenar( unsigned char*& ptrBuffer, int longitudBuffer);
void printMessages();
private:
};
#endif
Y el a.cpp es de la siguiente forma:
#include "a.h"
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
void a::printMessages()
{
Serial1.println();
Serial1.println("----");
Serial1.println("printMessages: ");
struct data *aux;
int i=0;
aux=primero;
while(aux!=NULL){
Serial1.println("----");
Serial1.print("lista ");
Serial1.println(i);
Serial1.print("x: ");
Serial1.println(aux->x, HEX);
Serial1.print("l: ");
Serial1.println(aux->l, HEX);
Serial1.print("datos: ");
for(int j=0; j< aux->l; j++){
Serial1.print(aux-> ptrData [j], HEX);
Serial1.print(":");
}
aux=aux->nextElement;
i++;
}
if(i==0){
Serial1.println("lista vacia");
}
Serial1.println();
}
int a::rellenar( unsigned char*& ptrBuffer, int longitudBuffer){
int numberOfMessages=0;
boolean _error=false;
Serial1.println("CAPTURA MENSAJES: ");
for(int i=0; i<longitudBuffer; i++){
if(ptrBuffer [i]==”0x0A”){
Serial1.println("++++++");
//Serial1.println(ptrAux[i]);
numberOfMessages++;
int longitud=(uint8_t) ptrBuffer [i+1]<<8 | (uint8_t) ptrBuffer [i+2];
struct data * nuevo;
nuevo=(struct data*) malloc(sizeof(struct data));
if(nuevo!=NULL){
index=0;
nuevo->l=longitud;
nuevo->x= ptrBuffer [i+3];
nuevo->ptrData=(unsigned char*)calloc(1, sizeof(unsigned char));
if(nuevo-> ptrData ==NULL){
_error=true;
}
if(!_error){
for(int j=0; j<l; j++){
nuevo-> ptrData [index]= ptrBuffer [j+i+4];
index++;
nuevo-> ptrData =(unsigned char*)realloc(nuevo-> ptrData,(index+1)*sizeof(unsigned char));
if(nuevo-> ptrData ==NULL){
_error=true;
j=longitud+1; i=longitudBuffer+1;
}
}
nuevo->nextElement=NULL;//el campo siguiente es null por ser el ultimo elemento de la lista
if(primero==NULL){
primero=nuevo;
ultimo=nuevo;
}
else{
//El que era el ultimo apunta al nuevo
ultimo->nextElement=nuevo;
//y hacemos que el ultimo sea el nuevo
ultimo=nuevo;
}
}
}
else{
Serial1.println("error structura");
_error=true;
}
}
}
free(ptrBuffer);
if(_error){
return(-1);Serial1.println("error");
}
else{
return(numberOfMessages);
}
}
En b.h lo tengo definido de la siguiente forma:
#ifndef b_h
#define b_h
#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include "a.h"
class b
{
Public
void pintar();
private:
};
#endif
El b.cpp:
#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include "b.h"
a objeto;
void b::pintar()
{
struct data *aux;
aux=a.primero;
objeto.printMessages();//La lista está vacia.
}
Luego en el .ino tengo lo siguiente:
#include "a.h"
#include "b.h"
a objeto1;
b objeto2;
void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
unsigned char *ptrBuffer=NULL;
ptrBuffer =(unsigned char*)calloc(50, sizeof(unsigned char));
for(int i=0; i<50; i++){
ptrBuffer[i]=i;
}
objeto1.rellenar(,50);
}
void loop()
{
objeto1.printMessages(); //Pinta la lista
objeto2.pintar(); //No pinta nada
}
El programa compila y pinta la lista si la llamo con el objeto1 pero al llamarla desde el objeto2 me dice que no hay ningún elemento, ¿Cómo puedo solucionar esto?
Gracias,
Saludos.