私はadaからCへのインタフェースに問題があります。Adaが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);
このC宣言:
struct ByteBuffer {
unsigned char *data;
size_t size;
};
このADAインポート:
function My_Function (
data : in ByteBuffer)
return Interfaces.C.int;
pragma Import (C, My_Function, "my_function");
このC宣言:
int my_function(struct ByteBuffer data);
特に私はこのADA宣言を有します
まだコードをデバッグするとき私はada側で(一例では)110のサイズを見つけますが、c側では0x7fffffffe750です。なぜ私のsize_tは乱されていますか? (注:データそのものも変更されていますが、修正するとうまくいけば、もう一方は修正されます)。
おそらくC構造のパディングです。 Adaがそのレコードをどのように処理しているかはわかりません。またはあなたのコードのいくつかのバグ。 –
私は 'pragma Convention(C、ByteBuffer);'がそれを解決したと思ったでしょう。多分私はC面で何かを指定する必要があるでしょうか? – LambdaBeta
パディングはコンパイラ固有です。それについての "C条約"はありません。 –