Domanda

Vorrei essere in grado di prevedere cosa ci sarà nel binario risultante quando chiamo Write in Ada per serializzare un record.Sai dove posso cercarlo?

Ho un software Ada legacy che produce un file binario scrivendo un record e devo eseguire il debug di un programma C++ che dovrebbe scrivere un file binario compatibile.Vorrei quindi capire quali regole segue Ada quando serializza un record, in modo da poter essere sicuro che il codice C++ produca un record funzionalmente equivalente.

È stato utile?

Soluzione

Come menzionato da altri, senza istruzioni aggiuntive il compilatore prenderà le proprie decisioni sul layout del record.L'approccio migliore sarebbe modificare il codice originale per scrivere il record utilizzando un layout specifico.In particolare, il clausola di rappresentanza record consente al programmatore Ada di specificare esattamente il layout fisico di un record.Dovresti infatti verificare se il codice originale ne presenta uno per la tipologia in questione.Se così fosse, questo risponderebbe esattamente alla tua domanda.

Altri suggerimenti

Il formato dell'output serializzato di 'Write has assolutamente niente a che fare con le clausole di rappresentanza.

Per impostazione predefinita, il compilatore genererà i componenti del record senza riempimento di allineamento nell'ordine in cui sono scritti nella dichiarazione del record, utilizzando uno schema di traduzione non definito dallo standard (quindi potresti non ottenere l'interoperabilità tra i compilatori).GNAT (il compilatore GCC Ada) restituisce ciascun componente in un numero intero di byte.

Se desideri eseguire lo streaming di valori di un tipo utilizzando un formato diverso, puoi sovrascrivere 'Scrivi per il tipo.Come esempio insolito, potresti eseguire lo streaming in XML.

Fondamentalmente, il compilatore riordinerà i componenti dei tuoi tipi di record, a meno che tu non utilizzi il comando pragma PACK o pragma PRESERVE_LAYOUT con i tuoi tipi di record.Inoltre, il compilatore riempirà gli oggetti per mantenere l'allineamento dei componenti del record.Seguono i componenti:

Numero intero:Numeri con segno in complemento a due a 8, 16 o 32 bit

Galleggiante:Formato IEEE a 32 bit

Long_Float:Formato IEEE a 64 bit

Punto fisso:8, 16 o 32 bit;tuttavia, l'intervallo e il delta specificati possono influire sull'essere 16 o 32

Enumerazioni:Numero intero, solitamente il primo elemento è rappresentato da 0

Booleani:Oggetto di enumerazione, lungo 8 bit, LSB memorizza il valore:0 = falso, 1 = vero

Caratteri:Oggetto di enumerazione, lungo 8 bit, da 0 a 127 senza segno

Tipi di accesso:32 bit, il valore a 32 bit pari a 0 rappresenta NULL

Array:archiviato in modo contiguo in ordine di riga principale, la dimensione dipende dal tipo di base.L'array viene riempito per garantire che tutti gli elementi abbiano il corretto allineamento per i rispettivi tipi.

IL Manuale di riferimento linguistico Ada95 dice (sezione 13.13.2):

"Per i tipi elementari la rappresentazione in termini di elementi del flusso è definita dall'implementazione.Per i tipi compositi, l'attributo Write o Read per ciascun componente viene chiamato in ordine canonico.L'ordine canonico dei componenti è l'ultima dimensione che varia più velocemente per un array e l'ordine aggregato posizionale per un record."

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top