PDA

View Full Version : [C] Come copiare le Struct


macsw
05-05-2011, 00:24
Ciao a tutti,

sono alle prese con il seguente programma: copiare alcuni dati in un array contenenti la struttura Pack e poi trasmettere l'array via TCP su sistema Linux. Prima di inviare la struttura ho visto che alcuni dati sono sbagliati, non li copia bene e di conseguenza in ricezione non ottengo la struttura desiderata. Ora vi mostro come copio i dati (mostro solo il codice essenziale)

/* Le strutture */

struct Time
{
int counter;
double value[100];
} packTime;


struct Freq
{
int frequency;
double record[50];
} packFreq;


typedef struct Pack
{
int size;
char data[104];
} ;


/* array Pack */
Pack arrayPack[2];


In pratica devo riempire l'array "arrayPack" una volta con una struttura packFreq nel campo data, e come array di char e una volta con un struttura packTime, sempre con array di char.

Ho fatto in questo modo:


arrayPack[0].size = 50; /* valore fittizio */
memcpy(&arrayPack[0].data, (char *) &packFreq, sizeof(packFreq) );

arrayPack[1].size = 50; /* valore fittizio */
memcpy(&arrayPack[1].data, (char *) &packTime, sizeof(packTime) );



Bene se provo a stampare i valori dell'array, non ottengo valori giusti. Per la stampa faccio così:

Pack tmpPack;
memcpy(&tmpPack, &arrayPack[0], sizeof(arrayPack[0]) );

Freq tmpFreq;
memcpy(&tmpFreq, (Freq*) &tmpPack.data, sizeof(tmpFreq) );

Time tmpTime;
memcpy(&tmpTime, (Time*) &tmpPack.data, sizeof(tmpTime) );


Le Strutture che ho chiamato tmpFreq e tmpTime non contengono valori corretti.

Cosa posso fare? Potete dirmi se ho usato un buon metodo con l'array e le memcpy?

Spero di ricevere aiuto, è molto importante,

Grazie a tutti!

darksax
05-05-2011, 09:53
Diciamo che questo, ad occhio, aiuta :)


Pack tmpPack;
memcpy(&tmpPack, &arrayPack[0], sizeof(arrayPack[0]) );

Freq tmpFreq;
memcpy(&tmpFreq, (Freq*) &tmpPack.data, sizeof(tmpPack) );

memcpy(&tmpPack, &arrayPack[1], sizeof(arrayPack[0]) );

Time tmpTime;
memcpy(&tmpTime, (Time*) &tmpPack.data, sizeof(tmpPack) );




cmq, per la copia di struct la memcpy va bene, ma


sizeof char = 1
sizeof int = 4
sizeof double = 8

la struttura Time contiene 100x8+4 byte (804 byte)
la struttura Freq contiene 50x8+4 byte (404 byte)
la struttura Pack contiene 104x1+4 byte (108 byte)


quindi ricontrolla le size/definizioni delle variabili utilizzate perche' puoi rischiare di perdere parte dei contenuti...
ciao

macsw
05-05-2011, 13:12
Grazie per i consigli, ora ci provo.

tuccio`
05-05-2011, 14:32
memcpy(&arrayPack[0].data, (char *) &packFreq, sizeof(packFreq) );ma questa riga (e quella simile successiva) non ti dà errore? voglio dire &arrayPack[0].data è un char**, non un char*, probabilmente quello che volevi fare era uno tra queste due:

&arrayPack[0].data[0]
arrayPack[0].data