PDA

Visualizza la versione completa : [C] Stampa di una struttura


foxes
16-10-2014, 11:52
Salve,
ho un programma C con una struttura complessa con dati misti.
Volevo sapere se c' un modo per stampare la struttura nel suo complesso, come se fosse una stringa unica.

Vorrei comparare byte x byte la struttura prodotta da 2 programmi differenti, in quanto se stampo i singoli elementi sono uguali per alla fine ottengo risultati diversi.

Grazie

Ciao

Scara95
16-10-2014, 12:09
Con una funzione ad hoc.
L'operatore == confronta byte a byte. Se hai un puntatore alla struttura puoi fare (*pa) == (*pb) oppure usare memcmp.
Una nota, se sono contenuti puntatori all'interno di tale struttura quasi certamente non vorrai comparare le due strutture byte a byte in quanto risulterebbero uguali SOLO nel caso i puntatori puntassero ALLA STESSA AREA DI MEMORIA.

foxes
16-10-2014, 12:12
Ciao,
io per vorrei stampare byte a byte la struttura in quanto non posso fare il confronto in quanto sono su 2 programmi differenti
Nella struttura non ci sono puntatori ma solo dati
Grazie.

Scara95
16-10-2014, 12:40
Non puoi salvare la struttura in un file binario?
Altrimenti puoi codificarla in base64

foxes
17-10-2014, 09:57
Ciao,
ho stampato le aree usando questa funzione:
for(int i=0; i<parms->haa_uxpr_array_elements; i++)

int *ptr = &nodei;
printf(">");
for(int j=0; j<50; j++)

printf("%.1x", *ptr);
ptr ++;

printf("<n");

Ed effettivamenre un piccola differenza fra le due strutture l'ho trovata.
Per non capisco una cosa
La prima parte della struttuta cos definita
typedef struct pregen_node_s
int pregen_bwd;
/* Internal use only (linklist) */
int pregen_fwd;
/* Internal use only (linklist) */
unsigned char pregen_ptr8;
/* Internal use only (struct ptr) */
unsigned char pregen_type;
/* J-Job, S-Step, O-Object */
unsigned char _filler13;
int pregen_job_seq;
int pregen_step_seq;
int pregen_obj_seq;
int pregen_obj_seq2;
union
.....
visualizzando i dati con la mia funzione vedo questi dati
>22c291c822c296b0482b568e20000001100d9c5c7f0f0f1f0f 1300c50000000000
e il valore di pregen_ptr 482b568
metre se faccio una printf
printf("ptr -> %x n", node->pregen_ptr);
ottengo questo valore 22c29444
Perch???
Lavoro sotto host quindi alcuni caratteri non corrispondono!

Scara95
17-10-2014, 10:32
Supponendo un char 8 bit i valori variano al massimo da 0 a FF, come puoi ottenere pi di due caratteri?
Sta di fatto che quel codice illeggibile.
Ci sono funzioni gi scritte per base64, perch ti devi complicare la vita con printf?

foxes
17-10-2014, 10:48
Supponendo un char 8 bit i valori variano al massimo da 0 a FF, come puoi ottenere pi di due caratteri?
Sta di fatto che quel codice illeggibile.
Ci sono funzioni gi scritte per base64, perch ti devi complicare la vita con printf?

ma per base64 c' una libreria da includere?
Io posso usare solo le standard.
Mi potresti dare dei link dove posso trovare degli esempi. Grazie

Per quanto riguarda il codice se io vado a convertire posizionalmente i caratteri delle funzione ottengo perfettamente i valori sia numerici che alfanumerici che mi restituirebbe una printf per quel campo. L'unica incongruenza la trovo in quel campo che ti ho evidenziato.

Scara95
17-10-2014, 11:13
ma per base64 c' una libreria da includere?
Io posso usare solo le standard.
Mi potresti dare dei link dove posso trovare degli esempi. Grazie

Per quanto riguarda il codice se io vado a convertire posizionalmente i caratteri delle funzione ottengo perfettamente i valori sia numerici che alfanumerici che mi restituirebbe una printf per quel campo. L'unica incongruenza la trovo in quel campo che ti ho evidenziato.
Sto tentando di dirti che non puoi stampare una stringa in quel modo perch tu stai passando a printf un puntatore a intero (4/8 byte a seconda) e non a char (1 byte) per cui non otterrai mai i valori corretti, ma leggerai anche parte dei successivi. Inoltre si aggiunge il problema dell'allineamento della struttura ( http://stackoverflow.com/questions/4306186/structure-padding-and-structure-packing ).

P.s. prima non avevo considerato l'allineamento.

foxes
17-10-2014, 12:02
Scusami vorrei farti un'altra domanda.
Perch se io faccio struc1 = strct2 non mi copia i dati correttamente, che funzione dovrei usare per la copia corretta?

Grazie

Scara95
17-10-2014, 12:06
= fa una copia byte a byte.

Loading