Je rencontre un problème d'interfaçage avec C d'ada. En particulier, j'ai cette déclaration ada:Ada envoyant un tampon d'octets à c
type Byte is mod 256; pragma Convention (C, Byte);
type ByteStream is array (Interfaces.C.size_t range <>) of Byte;
pragma Convention (C, ByteStream);
type VoidPointer is access all ByteStream;
type ByteBuffer is
record
data : VoidPointer;
size : Interfaces.C.size_t;
end record;
pragma Convention (C, ByteBuffer);
procedure Free is new Ada.Unchecked_Deallocation (ByteStream, VoidPointer);
et cette déclaration C:
struct ByteBuffer {
unsigned char *data;
size_t size;
};
et cette importation ada:
function My_Function (
data : in ByteBuffer)
return Interfaces.C.int;
pragma Import (C, My_Function, "my_function");
et cette déclaration C:
int my_function(struct ByteBuffer data);
Et pourtant, quand je débogue mon code Je trouve une taille de (dans un exemple) 110 sur le côté ada, mais 0x7fffffffe750 sur le côté c. Pourquoi ma taille n'est-elle pas mutilée? (Remarque: les données elles-mêmes sont également tronquées, mais nous espérons que la réparation corrigera l'autre).
Probablement le rembourrage de la structure C. Je ne sais pas comment Ada gère ses dossiers. Ou quelques bugs dans votre code. –
J'aurais pensé que 'Convention pragma (C, ByteBuffer);' aurait résolu cela. Peut-être que je dois aussi spécifier quelque chose du côté C? – LambdaBeta
Le remplissage est spécifique au compilateur. Il n'y a pas de "convention C" à ce sujet. –