Question

J'aimerais pouvoir prédire ce que sera le binaire résultant lorsque j'appellerai Ecrire dans Ada pour sérialiser un enregistrement. Savez-vous où je peux regarder cela?

J'ai quelques logiciels Ada hérités qui produisent un fichier binaire en écrivant un enregistrement et je dois déboguer un programme C ++ censé écrire un fichier binaire compatible. Je voudrais donc comprendre les règles suivies par Ada lorsqu’il sérialise un enregistrement, afin de pouvoir être sûr que le code C ++ produira un enregistrement fonctionnellement équivalent.

Était-ce utile?

La solution

Comme d'autres l'ont mentionné, sans instruction supplémentaire, le compilateur prendra ses propres décisions concernant la disposition des enregistrements. La meilleure approche serait de changer le code original pour écrire l'enregistrement en utilisant une mise en page spécifique. En particulier, la clause de représentation d'enregistrement permet au programmeur Ada de spécifier exactement la disposition physique d'un enregistrement. En fait, vous devriez vérifier si le code d'origine en possède un pour le type en question. Si tel est le cas, cela répondrait précisément à votre question.

Autres conseils

Le format de la sortie sérialisée de 'Write n'a absolument rien à faire avec les clauses de représentation.

Par défaut, le compilateur génère des composants d'enregistrement sans alignement dans l'ordre dans lequel ils ont été écrits dans la déclaration d'enregistrement, en utilisant un schéma de traduction non défini par la norme (vous risquez donc de ne pas obtenir d'interopérabilité entre les compilateurs. ). GNAT (le compilateur GCC Ada) génère chaque composant en un nombre entier d'octets.

Si vous souhaitez diffuser des valeurs d'un type en utilisant un format différent, vous pouvez remplacer le paramètre 'Write pour le type. Comme exemple inhabituel, vous pouvez diffuser en XML.

En gros, le compilateur réorganise les composants de vos types d’enregistrement, sauf si vous utilisez les commandes pragma PACK ou pragma PRESERVE_LAYOUT avec vos types d’enregistrement. En outre, le compilateur complétera les objets pour maintenir l'alignement des composants de l'enregistrement. Les composants suivent:

Entier: nombres signés en complément de 8, 16 ou 32 bits

Float: format IEEE 32 bits

Long_Float: format IEEE 64 bits

Point fixe: 8, 16 ou 32 bits; cependant, la plage et le delta spécifiés peuvent affecter le fait d'être 16 ou 32

Énumérations: Entier, généralement le premier élément est représenté par 0

Booléens: objet d'énumération, d'une longueur de 8 bits, le LSB enregistre la valeur: 0 = faux, 1 = vrai

Caractères: objet d'énumération, longueur de 8 bits, non signé de 0 à 127

Types d'accès: 32 bits, la valeur 32 bits à 0 représente la valeur NULL

Tableaux: stockés de manière contiguë dans l'ordre des lignes, la taille dépend du type de base. La matrice est complétée pour assurer que tous les éléments ont le bon alignement pour leurs types.

Le Manuel de référence du langage Ada95 indique (section 13.13.2):

"Pour les types élémentaires, la représentation en termes d'éléments de flux est définie par la mise en oeuvre. Pour les types composites, l'attribut Write ou Read de chaque composant est appelé dans un ordre canonique. La dernière dimension de l'ordre canonique des composants varie le plus rapidement pour un tableau, ainsi que l'ordre d'agrégation positionnelle pour un enregistrement. "

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top