gpt4 book ai didi

c - 如何读取 Ada 中的 C Void 指针?

转载 作者:行者123 更新时间:2023-12-04 02:28:52 24 4
gpt4 key购买 nike

有以下以 void 指针为参数的 C 函数:

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 私有(private)类型 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");

关于c - 如何读取 Ada 中的 C Void 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65531680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com