Pergunta

Eu gostaria de ser capaz de prever o que vai estar no binário resultante quando eu chamo Write em Ada para serializar um registro. Você sabe onde eu posso olhar para isso?

Eu tenho alguns softwares Ada legado que produz um arquivo binário por write-ing um registro, e eu preciso para depurar um programa C ++ que é suposto para escrever um arquivo binário compatível. Então, eu gostaria de entender o que governa Ada segue quando ele serializa um registro, para que eu possa ter certeza de que o código C ++ irá produzir um registro funcionalmente equivalente.

Foi útil?

Solução

Como mencionado por outros, sem instrução adicional que o compilador vai fazer as suas próprias decisões sobre layout do registro. A melhor abordagem seria a de alterar o código original para gravar o registro usando um layout específico. Em particular, o registro cláusula de representação permite que o programador Ada especificar exatamente o layout físico de um registro. Na verdade, você deve verificar para ver se o código original tem um destes para o tipo em questão. Se isso acontecer, então isso iria responder a sua pergunta com precisão.

Outras dicas

O formato da saída serializada do 'Write tem absolutamente nada para fazer com cláusulas de representação.

Por padrão, o compilador componentes registro de saída sem preenchimento de alinhamento na ordem em que eles são escritos na declaração de registro, usando um esquema de tradução que não é definida pelo padrão (para que você não pode obter a interoperabilidade entre compiladores ). GNAT (o compilador GCC Ada) produz cada componente em um número inteiro de bytes.

Se você deseja transmitir valores de um tipo usando algum formato diferente, você pode substituir 'Write para o tipo. Como um exemplo incomum, você pode transmitir para XML.

Basicamente, o compilador irá reordenar os componentes de seus tipos de registro, a menos que você use o PACK pragma ou os comandos PRESERVE_LAYOUT Pragma com seus tipos de registro. Além disso, a almofada de compilador vontade objetos para manter o alinhamento dos componentes ficha. Componentes seguir:

Integer: 8, 16 ou 32 bits dois complementos números assinados

Float: 32-bit formato IEEE

Long_Float: formato IEEE de 64 bits

Fixed-Point: 8, 16 ou 32 bits; no entanto, a gama e delta especificado pode afectar sendo 16 ou 32

Enumerations: Integer, geralmente primeiro elemento é representado por 0

Booleans: enumeração objeto, 8 bits de comprimento, o LSB armazena o valor: 0 = falso, 1 = true

Personagens: enumeração objeto, 8 bits de comprimento, sem sinal de 0 a 127

Tipos de acesso: 32 bits, o valor de 0 32-bit representa NULL

Arrays: armazenados de forma contígua na ordem da maior linha, o tamanho depende do tipo de base. A matriz é acolchoada para garantir que todos os elementos têm o alinhamento adequado para seus tipos.

O Ada95 Language Reference diz (secção 13.13.2):

"Para tipos elementares, a representação em termos de elementos de fluxo é definido pela implementação. Para os tipos de compostos, o Write ou atributo de leitura para cada componente é chamado em uma ordem canônica. A ordem canônica de componentes é a última dimensão variando mais rápido para um array, ea ordem agregada posicional para um registro ".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top