如何解决如何在 Ada 中读取 C Void 指针?
有以下 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");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。