Ciao a tutti, vorrei poter simulare un invio di dati tramite rete e per fare questo ho definito le seguenti strutture.
typedef struct Data {
int valid;
double value;
} Data;
typedef struct Message {
int id;
int size;
int nr;
Data* data;
} Message;
Per l'invio vorrei copiare tutte le informazioni all'interno di un array di BYTE.
typedef unsigned char BYTE;
Di seguito ho messo per comodità tutto dentro alla funzione main.
Anche i dati di input sono in questo caso dei semplici dati di esempio.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int sz = 5;
int id = 1;
int i;
Data* input = malloc(sizeof(Data) * sz);
for (i = 0; i < sz; i++) {
input[i].valid = 1;
input[i].value = (double)i;
}
int bufferSize = (sizeof(int) * 3) + (sizeof(Data) * sz);
BYTE* buffer = malloc(sizeof(BYTE) * bufferSize);
memcpy(buffer, &id, sizeof(int));
memcpy(buffer + sizeof(int), &bufferSize, sizeof(int));
memcpy(buffer + (sizeof(int) * 2), &sz, sizeof(int));
memcpy(buffer + (sizeof(int) * 3), input, sizeof(Data) * sz);
printf("Input data\nid: %d\nsize: %d\nnr: %d\n", id, bufferSize, sz);
for (i = 0; i < sz; i++)
printf("input[%d].valid: %d\ninput[%d].value: %lf\n", i, input[i].valid, i, input[i].value);
printf("\nOutput data\n");
// test
Message* msg = (Message*)buffer;
printf("id: %d\n", msg->id);
printf("size: %d\n", msg->size);
printf("nr: %d\n", msg->nr);
// this way doesn't work
// for (i = 0; i < sz; i++)
// printf("output[%d].valid: %d\noutput[%d].value: %lf\n", i, msg->data[i].valid, i, msg->data[i].value);
Data* output = malloc(sizeof(Data) * sz);
output = memcpy(output, &msg->data, sizeof(Data) * sz);
for (i = 0; i < sz; i++)
printf("output[%d].valid: %d\noutput[%d].value: %lf\n", i, output[i].valid, i, output[i].value);
free(output);
free(buffer);
free(input);
}
Il mio problema si presenta quando cerco di estrarre i valori contenuti in data, sezione test. Purtroppo queste informazioni sembrano non poter essere ricostruite, ne per mezzo di un cast, e neppure copiando le informazioni in un altro array dinamico dello stesso tipo e dimensione. Però tutte le altre informazioni sono disponibili e corrette.
Non riesco a capire dove sto sbagliando. Potreste darmi una mano?
Vi ringrazio.