Problema con struct

2 views
Skip to first unread message

Jose Ramon Simó Martínez

unread,
Feb 2, 2013, 10:21:11 AM2/2/13
to ios-des...@googlegroups.com
Hola,

me he dado cuenta de un curioso problema que me ha surgido manejando
una variable tipo struct. El escenario es el siguiente:

- Tengo una estructura de la siguiente forma:

typedef struct s_ejemplo
{
int a;
int b;
int c;
}Ejemplo;

- Esta estructura es compartida por dos aplicaciones que se comunican
mediante sockets UDP. Digamos que la aplicación A (appA) le envía un
array de esta estructura a la aplicación B (appB).

- La appB lee de la siguiente manerar el array:


- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData
*)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
{
Ejemplo caja;

int tamBytesEjemplo = sizeof(Ejemplo);

for(int i=0;i<[data length];i=i+tamBytesEjemplo)
{
NSRange rangoBytes;

rangoBytes.location = i;
rangoBytes.length = tamBytesCaja-1;

[data getBytes:&caja range:rangoBytes];

}

}


- La appA está desarrollada en visual c++ mientras que la appB es en
iOS, concretamente para iPad.

- Cuando pruebo el funcionamiento de la aplicación con el simulador
iOS, esta recibe correctamente la estructura enviada por la appA.

Y bien, el problema viene cuando pruebo la appB en el dispositivo real
iPad. Entonces lo que ocurre es que la variable "int c" es leida de
forma incorrecta, es como si hubiera "basura".

El funcionamiento lógico de enviar y recibir datos, así como leerlos,
parece el correcto. Pero la pregunta principal es, ¿por qué esa
diferencia entre el funcionamiento del simulador iOS y el dispositivo
real?

La solución temporal que le he dado es incluir una varible tipo "int
basura;" en el último elemento del Struct, de esa manera la variable
"int c" es leída correctamente.

Saludos,

Jose Ramon

Jorge Bernal

unread,
Feb 2, 2013, 1:38:03 PM2/2/13
to ios-des...@googlegroups.com
No se explicarlo con detalle, pero creo que esta relacionado con la
forma en que el compilador alinea los structs internamente para que
tengan un tamaño potencia de 2.

Puede que usar uint32_t en lugar de int ayude, y tambien esta
__attribute__((aligned))
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html

Aunque para un protocolo de comunicacion binario igual te interesa
mirar https://code.google.com/p/protobuf/

2013/2/2 Jose Ramon Simó Martínez <jrvar...@gmail.com>:
> --
> Has recibido este mensaje porque estás suscrito al grupo "Programación para iOS (iPhone, iPad, iPod)" de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a ios-desarroll...@googlegroups.com.
> Para publicar una entrada en este grupo, envía un correo electrónico a ios-des...@googlegroups.com.
> Visita este grupo en http://groups.google.com/group/ios-desarrollo?hl=es.
> Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
>
>



--
Jorge Bernal | jbe...@gmail.com | jo...@automattic.com
Mobile Engineer @ Automattic | http://automattic.com/

http://jorgebernal.info/ | http://jorgebernal.es/ | http://twitter.com/koke
Reply all
Reply to author
Forward
0 new messages