如何在Ada中读取CVoid指针?

有以下 C-Function 以 void 指针作为参数:

int read(void *buf, size_t num);

int => 返回读取操作是否成功。
void *buf => c void 无符号字节缓冲区指针作为函数参数。
size_t num => 应填充的字节缓冲区的大小。

目前我有以下 Ada 实现:

with Ada.Text_IO;
with System;
with Interfaces.C;

use Ada.Text_IO;
use Interfaces.C;

procedure Main is

      -- Imported C function
      function Read(Buf:System.Address; Num:int) return int;
      pragma Import(C, Read, "read");

      -- Byte Array Type
      type Byte_Type is mod 2**8;
      for Byte_Type'Size use 8;

      type Byte_Array_Type is array(Positive range <>) of Byte_Type;

      -- Initialize
      Buffer_Check:int;
      Buffer_Size:Positive:=10;
      Buffer_Array:Byte_Array_Type(1 .. Buffer_Size):=(others => 0); --initialise array with zero
           
     
   begin
      
      Buffer_Check:=Read(Buffer_Array'Address, int(Buffer_Size));

      if Buffer_Check /= 0 then

         Put_Line("Read success");

         for K in Buffer_Array'First .. Buffer_Array'Last loop

            Put_Line(Integer'Image(Integer(Byte_Type(Buffer_Array(K)))));

         end loop;

      else
         
         Put_Line("Read Failed");
         
      end if;
      
end Main;

Buffer_Array 没有按预期填满。如果一些 Ada 爱好者有一些提示或想法,那就太好了。

回答

假设 Ada 私有类型System.Address和 C 指针兼容是极其不可移植和不必要的。使用约定 C 声明您的类型,并将您的out参数声明为out参数:

pragma Convention (C, Byte_Type);
pragma Convention (C, Byte_Array_Type);

function Read (Buf : out Byte_Array_Type; Num : in int) return int;
pragma Import (C, Read, "read");


以上是如何在Ada中读取CVoid指针?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>