Newsgroup: it.comp.lang.c
Titolo: Convertire STRUCT in array di bytes

Ciao
il mio problema è questo. Ho a disposizione librerie in c già fatte e devo
renderle accessibili da Java tramite JNI (creando una sorta di wrapper
insomma). Alcune funzioni ritornano dei puntatori a struct arbitrariamente
complesse. Siccome questi puntatori sono argomenti di altre funzioni c che
devo rendere accessibili, ho pensato a un modo per passare a java i
riferimenti a queste struct, o al limite anche l'intera struct stessa, in
modo che poi chi chiama da Java le funzioni c che vogliono quel'argomento
possa passargli il puntatore/la struct.
Quello che mi chiedevo è: come posso convertire (in c) una struct in un
array di bytes e viceversa? 
-- 
Taglia
=========
http://www.vortexmind.net
http://www.tgplanes.com
http://www.netwargamingitalia.net

 array di bytes e viceversa?
Certo :-)
struct mystruct a;
char *b = (char *)a;
Fatto :-)
Problema:
Il (compilatore) C ha il diritto di "paddare" una struct con dei bytes
vuoti. Esempio:
char a; // sizeof(char) = 1
long b; // sizeof(long) = 4
La struct probabilmente avrà size complessiva di 8: il char sarà paddato in
maniera che il long sia allineato ai 32 bits.
Molti compilatori hanno una #pragma pack per risolvere il problema...
Cmq puoi fare qualcosa del tipo:
typedef struct _mystruct {
    char a;
    long b;
    double c;
} mystruct;
mystruct *ptr = NULL;
char *start = (char *)ptr;
size_t offset_a = (char*)&(ptr->a) - start;
size_t offset_b = (char*)&(ptr->b) - start;
size_t offset_c = (char*)&(ptr->c) - start;
Dovrebbe funzionare... :-)
--- bye

Grazie per gli spunti. Ho provato a fare qualcosa come dici tu e almeno me
lo ha compilato :) Ora devo vedere se funziona anche ihihihi
In ogni caso ho pensato che è meglio passare solo l'indirizzo di memoria (il
puntatore) e non l'intera struct (quella che devo maneggiare io è una
struct con dentro array di altre struct ... insomma inutile che me la
palleggi tra c e java ...)


Ooops... Scritto stronzata:
struct mystruct a;
char *b = (char *)a;
NONONO!
struct mystruct a;
char *b = (char *)&a;
Ecco!

Quindi se ho capito bene:
avendo queste variabili così dichiarate
char *byteBuff;
struct MyStruct *ReadDB;
Da puntatore a array di bytes:
==============================
byteBuff=(char*)ReadDB;
Viceversa (ovviamente voglio solo passare l'indirizzo di memoria, non tutta
la struttura):
==============================
ReadDB=(struct MyStruct*)byteBuff
Dovrei mettere la & se volessi passare la struct e non l'indirizzo giusto?


 byteBuff=(char*)ReadDB;
Sarebbe preferibile usare void * al posto di char*. A rigore di standard
la doppia conversione (struct * -> char * -> struct *) potrebbe portare
ad un risultato diverso dall'originale (il void * garantisca dalla
perdita di informazioni). In pratica su x86 il problema non esiste, ma
e` comunque piu` pulito (se JNI lo permette).
Luca
-- 
Home: 
http://kronoz.cjb.net
Dicono che  il cane sia  il miglior  amico dell'uomo. Secondo me  non e`
vero. Quanti dei vostri amici avete fatto castrare, recentemente?

 size_t offset_c = (char*)&(ptr->c) - start;
offsetof, definita in stddef.h ;)
Luca
-- 
Home: 
http://kronoz.cjb.net
E' stato a causa di una donna che ho cominciato a bere e non ho mai
avuto la cortesia di ringraziarla.

Guarda ho provato a fare una doppia conversione e poi a passare la nuova
variabile a una delle funzioni che la richiedono (restando all'interno di
C) ed è tutto andato correttamente (certo che ora sto testando su X86,il
programma finale deve girare su un palmare IPAQ che ha un processore ARM
non X86 compatibile - ma questo è un problema che affronterò dopo eheh). In
ogni caso ora ho già dei problemi a far passare sto cavolo di puntatore
attraverso java (o meglio, sono riuscito a mandare l'array di bytes a java,
ora il problema è riceverlo in c dalla chiamata java, sto seguendo le
istruzioni del JNI book che c'è sul sito della sun ma mi manda in crash
brutale la JVM ihihih. Proverò con un po'di programmini stupidi tipo
helloworld per capire dove sbaglio...)
-- 


> offsetof, definita in stddef.h ;)
Talvolta mi dimentico dell'Alta Tecnologia :-)
--- bye