访问类型的 Ada 数组
Ada arrays of access type
Ada 程序员,
我正在尝试将指针数组传递给 Ada 中的 C 函数。我是 Ada 的新手。
代码如下:
with Interfaces.C; use Interfaces.C;
with asm_generic_int_ll64_h; use asm_generic_int_ll64_h;
block : array(Integer range 1 .. 6) of access uu_u8;
one : aliased uu_u8 := uu_u8(1);
two : aliased uu_u8 := uu_u8(2);
three : aliased uu_u8 := uu_u8(3);
four : aliased uu_u8 := uu_u8(4);
five : aliased uu_u8 := uu_u8(5);
six : aliased uu_u8 := uu_u8(6);
ans : uu_u8;
begin
block(1) := one'Access;
block(2) := two'Access;
block(3) := three'Access;
block(4) := four'Access;
block(5) := five'Access;
block(6) := six'Access;
call_c_func(block(1));
ans := block(1).all;
最后一行导致错误:
raised STORAGE_ERROR : stack overflow (or erroneous memory access)
提前致谢!
根据您的评论,很明显您使用了错误的数组类型。
您在 Ada 端的数组是指向 uu_8
的指针数组。但是,在 C 端,预期 __u8*
,即指向 __u8
值的指针。类型不兼容。
在 C 中,数组通常作为指向第一个元素的指针传递。这里就是这种情况。因此,在 Ada 方面,您实际需要的是一个包含 uu_8
值的数组:
type My_Array is array (Integer range <>) of uu_8;
pragma Convention (C, My_Array);
Block : My_Array := (1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6);
function read_i2c_block_data
(file : int;
command : asm_generic_int_ll64_h.uu_u8;
length : asm_generic_int_ll64_h.uu_u8;
values : in out My_Array) return asm_generic_int_ll64_h.uu_s32;
pragma Import (C, read_i2c_block_data, "read_i2c_block_data");
编译器会将您的 Ada 数组映射到一个指向第一个元素的指针,当它具有约定 C 并用于以 C 调用约定导入的函数中时。 in out
告诉 Ada C 函数可能会修改数组。
Ada 程序员,
我正在尝试将指针数组传递给 Ada 中的 C 函数。我是 Ada 的新手。
代码如下:
with Interfaces.C; use Interfaces.C;
with asm_generic_int_ll64_h; use asm_generic_int_ll64_h;
block : array(Integer range 1 .. 6) of access uu_u8;
one : aliased uu_u8 := uu_u8(1);
two : aliased uu_u8 := uu_u8(2);
three : aliased uu_u8 := uu_u8(3);
four : aliased uu_u8 := uu_u8(4);
five : aliased uu_u8 := uu_u8(5);
six : aliased uu_u8 := uu_u8(6);
ans : uu_u8;
begin
block(1) := one'Access;
block(2) := two'Access;
block(3) := three'Access;
block(4) := four'Access;
block(5) := five'Access;
block(6) := six'Access;
call_c_func(block(1));
ans := block(1).all;
最后一行导致错误:
raised STORAGE_ERROR : stack overflow (or erroneous memory access)
提前致谢!
根据您的评论,很明显您使用了错误的数组类型。
您在 Ada 端的数组是指向 uu_8
的指针数组。但是,在 C 端,预期 __u8*
,即指向 __u8
值的指针。类型不兼容。
在 C 中,数组通常作为指向第一个元素的指针传递。这里就是这种情况。因此,在 Ada 方面,您实际需要的是一个包含 uu_8
值的数组:
type My_Array is array (Integer range <>) of uu_8;
pragma Convention (C, My_Array);
Block : My_Array := (1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6);
function read_i2c_block_data
(file : int;
command : asm_generic_int_ll64_h.uu_u8;
length : asm_generic_int_ll64_h.uu_u8;
values : in out My_Array) return asm_generic_int_ll64_h.uu_s32;
pragma Import (C, read_i2c_block_data, "read_i2c_block_data");
编译器会将您的 Ada 数组映射到一个指向第一个元素的指针,当它具有约定 C 并用于以 C 调用约定导入的函数中时。 in out
告诉 Ada C 函数可能会修改数组。