Pasar datos de una estructura entre clases.

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.

Hola.
Tu programa, tal y como lo tienes publicado, no me compila y, tal como lo tienes ahora, tengo más preguntas que respuestas:

¿Qué significa el primer parámetro de esta función?:
int rellenar( unsigned char*& ptrBuffer, int longitudBuffer);
¿Por qué la llamas sin indicar el primer parámetro?
objeto1.rellenar(,50);

De todas formas, no entiendo exactamente qué quieres hacer, pero me parece que estás liando mucho la madeja. ¿Podrías intentar explicar un poco más qué estás intentando?

sube todo por favor usando Additonal Options
seleccionas archivo y cargas el primero.
luego more attachments para el 2do, 3ro, 4to etc
o bien juntas todos los comprimes y subes uno solo.

Mientras no se si será de ayuda pero prueba usando extern y el nombre de la estructura como si la volvieras a definir en tu código principal.

y esto objeto1.rellenar(,50); no se como te compila

Hola, perdonad por el código anterior, era solo un ejemplo que hice en el notepad jejeje . Este nuevo código si que compila, adjunto las dos librerías y el .ino, también os pongo lo que me muestra el monitor serie:

IniciandoCAPTURA MENSAJES: 
++++++
OBJETO RX: 

----
printMessages: 
----
lista 0
identificador: 3
longitud: A
datos: 4:5:6:7:8:9:A:B:C:D:
OBJETO MOSTAR: 

----
printMessages: 
lista vacia

OBJETO RX: 

----
printMessages: 
----
lista 0
identificador: 3
longitud: A
datos: 4:5:6:7:8:9:A:B:C:D:
OBJETO MOSTAR: 

----
printMessages: 
lista vacia

Se puede ver como el objetoRx si muestra la lista mientras que el objetoMostrar no lo hace.
Muchas gracias.
Saludos.

mostrar.rar (721 Bytes)

recibir.rar (1.58 KB)

pruebaStruct2.ino (807 Bytes)

Bueno. Sigues sin explicar qué quieres realizar, porque no veo mucha lógica a tus dos librerías y, seguramente que lo que persigues se puede obtener de manera más sencilla y práctica. Vayamos por partes.
En tu código, primeramente defines un objetoRx y un objetoMostrar. A continuación cargas objetoRx con unos datos que imprimirás posteriormente. Hasta ahí bien. Sin embargo con objetoMostrar no haces nada aparte de ejecutar su método pintar (por otra parte es lo único que tiene el objeto) que lo que hace es imprimir objetoAuxRx, con el que tampoco has hecho nada.
Una solución (chapucera, porque como te he dicho tampoco sé qué pretendes exactamente) sería lo que te decía surbyte.

En el archivo.ino quita la definición objetoRx, pues lo vamos a definir externamente.

En mostrar.h agrega la definición:
extern recibir objetoRx;

En mostrar.cpp:

recibir objetoRx;


void mostrar::pintar()
{
	
	objetoRx.printMessages();//La lista est? vacia.
}

Y me cuentas. Pero como te he dicho hay otros métodos más prácticos si explicas con más detalle qué deseas hacer entre esas dos clases, pues no tiene mucha lógica el código que has mostrado.
Saludos

Hola,
Gracias por la respuesta. Esto solo es un ejemplo pequeño de lo que quiero llegar a hacer.
Lo que trato de hacer es lo siguiente, tener una librería que recoja los datos del puerto serie (recibir) y otra que trabaje con esos datos( mostrar).
La librería mostrar solo tiene un método debido a que no era capaz de acceder a los datos de la estructura y al final solo intentaba pintarlos para ver si podía acceder o no a ella.
No se si con esto tienes suficiente información para entender lo que trato de hacer.
He probado a declarar como extern objetoRx y funciona, muchas gracias. De todas formas me gustaría saber si hay una manera mas correcta de hacer las cosas.
Saludos y muchas gracias.

Si ambas librerías trabajan con los mismos datos, entonces lo lógico, entiendo yo, sería definir una sola librería e implementar en ella todos los métodos. Puedes, incluso, si deseas mantenerlas "desmontadas" para cuando sólo necesites la clase a, hacer que la clase b herede de la a, añadiendo sencillamente las nuevas propiedades y métodos que necesites.
No obstante, si por alguna razón deseas separarlas, y recibir una estructura de una a la otra, lo lógico sería implementarlo en el constructor, y que éste copie los datos al objeto nuevo, o bien tome sus datos por referencia mediante referencias o punteros (teniendo en cuenta que si los modifica, también lo hará en los datos originales).

Por ejemplo, almacenando en un objeto un puntero a otro:

archivo mostrar.h

#ifndef mostrar_h
#define mostrar_h

#include <Arduino.h>
#include "recibir.h"

class mostrar{
	public:
                mostrar(recibir *objeto):objetoRx(objeto){}; //constructor de mostrar. Pasamos a objetoRx el puntero recibido en el constructor
		void pintar();
	private:
                recibir *objetoRx; // puntero a objeto tipo recibir
};

#endif

archivo mostrar.cpp:

#include "mostrar.h"

void mostrar::pintar()
{
	objetoRx->printMessages();//Al tratarse de puntero, usaremos -> en lugar de .
}

archivo.ino

recibir objetoRx;
mostrar objetoMostrar(&objetoRx); //pasamos la dirección de objetoRx
// resto del archivo igual

Muchas gracias por la ayuda. Probé de las dos formas y funciona a la perfección. Ahora voy a intentar implementar un método para que analice los datos de la estructura y otro que elimine los datos de la estructura.

Saludos y muchas gracias.