Pregunta

Me gustaría poder predecir qué habrá en el binario resultante cuando llame a Write in Ada para serializar un registro.¿Sabes dónde puedo buscar esto?

Tengo un software Ada heredado que produce un archivo binario escribiendo un registro y necesito depurar un programa C++ que se supone que escribe un archivo binario compatible.Entonces, me gustaría entender qué reglas sigue Ada cuando serializa un registro, para poder asegurarme de que el código C++ producirá un registro funcionalmente equivalente.

¿Fue útil?

Solución

Como mencionaron otros, sin instrucciones adicionales el compilador tomará sus propias decisiones sobre el diseño del registro.El mejor enfoque sería cambiar el código original para escribir el registro usando un diseño específico.En particular, el cláusula de representación récord permite al programador de Ada especificar exactamente el diseño físico de un registro.De hecho, deberías comprobar si el código original tiene uno de estos para el tipo en cuestión.Si es así, entonces esto respondería su pregunta con precisión.

Otros consejos

El formato de la salida serializada de 'Write tiene absolutamente nada que ver con cláusulas de representación.

De forma predeterminada, el compilador generará componentes de registro sin relleno de alineación en el orden en que están escritos en la declaración de registro, utilizando un esquema de traducción que no está definido por el estándar (por lo que es posible que no obtenga interoperabilidad entre compiladores).GNAT (el compilador GCC Ada) genera cada componente en un número entero de bytes.

Si desea transmitir valores de un tipo usando algún formato diferente, puede anular 'Escribir para el tipo.Como ejemplo inusual, podría transmitir a XML.

Básicamente, el compilador reordenará los componentes de sus tipos de registros, a menos que utilice los comandos pragma PACK o pragma PRESERVE_LAYOUT con sus tipos de registros.Además, el compilador rellenará los objetos para mantener la alineación de los componentes del registro.Los componentes siguen:

Entero:Números con signo en complemento a dos de 8, 16 o 32 bits

Flotar:Formato IEEE de 32 bits

Flotador largo:Formato IEEE de 64 bits

Punto fijo:8, 16 o 32 bits;sin embargo, el rango y el delta especificados pueden afectar el hecho de tener 16 o 32 años.

Enumeraciones:Entero, normalmente el primer elemento está representado por 0

Booleanos:Objeto de enumeración, de 8 bits de longitud. El LSB almacena el valor:0 = falso, 1 = verdadero

Caracteres:Objeto de enumeración, 8 bits de longitud, sin firmar del 0 al 127

Tipos de acceso:32 bits, el valor 0 de 32 bits representa NULL

Matrices:almacenados de forma contigua en orden de fila principal, el tamaño depende del tipo de base.La matriz está rellena para garantizar que todos los elementos tengan la alineación adecuada para sus tipos.

El Manual de referencia del lenguaje Ada95 dice (sección 13.13.2):

"Para los tipos elementales, la representación en términos de elementos de flujo está definida por la implementación.Para los tipos compuestos, el atributo de escritura o lectura de cada componente se llama en un orden canónico.El orden canónico de los componentes es la última dimensión que varía más rápidamente para una matriz y el orden agregado posicional para un registro".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top