2008-09-17 6 views
3

Je voudrais être capable de prédire ce qui sera dans le binaire résultant quand j'appelle Write in Ada pour sérialiser un enregistrement. Savez-vous où je peux chercher ça?Comprendre comment Ada sérialise un enregistrement

J'ai un logiciel Ada hérité qui produit un fichier binaire en écrivant un enregistrement, et j'ai besoin de déboguer un programme C++ qui est censé écrire un fichier binaire compatible. Donc, je voudrais comprendre quelles règles Ada suit quand il sérialise un enregistrement, de sorte que je peux m'assurer que le code C++ produira un enregistrement fonctionnellement équivalent.

+1

Si je ne me trompe pas, c'est la toute première question Ada sur Stackoverflow! Woohoo! –

Répondre

1

Comme mentionné par d'autres, sans instruction supplémentaire le compilateur prendra ses propres décisions au sujet de la disposition d'enregistrement. La meilleure approche serait de changer le code original pour écrire l'enregistrement en utilisant une mise en page spécifique. En particulier, le record representation clause permet au programmeur Ada de spécifier exactement la disposition physique d'un enregistrement. En fait, vous devriez vérifier si le code original en contient un pour le type en question. Si c'est le cas, cela répondra à votre question avec précision.

1

Le Ada95 Language Reference Manual dit (section 13.13.2).

« Pour les types élémentaires, la représentation en termes d'éléments de flux est défini par l'implémentation Pour les types composites, l'écriture ou l'attribut Lecture pour chaque composant est appelé dans un L'ordre canonique des composants est la dernière dimension qui varie le plus rapidement pour un tableau, et l'ordre agrégé positionnel pour un enregistrement. "

+0

Merci pour votre référence. J'espère que quelqu'un a écrit un peu plus sur le sujet. –

+0

Ada les gens ont tendance à être un peu de sticklers pour la norme. Nous n'avons pas de mises en œuvre canoniques à se référer. Donc, si vous demandez "Comment Ada fait X?" et quelqu'un répond «C'est la mise en œuvre défiée», c'est plus ou moins la fin de la question. –

2

Fondamentalement, le compilateur réorganisera 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 tamponnera les objets pour maintenir l'alignement des composants d'enregistrement. Composants suivent:

Entier: 8, 16 ou 32 bits complément à deux nombres positifs

Float: 32 bits format IEEE

Long_Float: 64 bits format IEEE

fixe-Point : 8, 16 ou 32 bits; cependant, la gamme et delta spécifié peuvent affecter être 16 ou 32

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

booléens: objet Enumeration, 8 bits de long, le LSB stocke la valeur: 0 = faux , 1 = true

caractères: objet Enumeration, 8 bits de long, non signée 0 à 127

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

Arrays: stockés de manière contiguë dans row- commande majeure , la taille dépend du type de base. Le tableau est rembourré pour s'assurer que tous les éléments ont l'alignement approprié pour leurs types.

3

Le format de la sortie sérialisée de 'Write a absolument rien à faire avec des clauses de représentation. Par défaut, le compilateur génère les composants d'enregistrement sans bourrage d'alignement dans l'ordre dans lequel ils sont écrits dans la déclaration d'enregistrement, en utilisant un schéma de traduction qui n'est pas défini par le standard (vous ne pouvez donc pas obtenir l'interopérabilité entre compilateurs). GNAT (le compilateur GCC Ada) sort chaque composant en un nombre entier d'octets.

Si vous souhaitez diffuser des valeurs d'un type utilisant un format différent, vous pouvez remplacer 'Écrire pour le type. Comme exemple inhabituel, vous pourriez diffuser en XML.

Questions connexes