首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问类型的Ada数组

访问类型的Ada数组
EN

Stack Overflow用户
提问于 2018-07-17 04:30:47
回答 1查看 650关注 0票数 0

阿达编码器,

我试图从Ada传递一个指向C函数的指针数组。我是艾达的新手。

下面是代码:

代码语言:javascript
复制
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;

最后一行将导致错误:

引发的STORAGE_ERROR :堆栈溢出(或错误的内存访问)

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-17 12:52:19

从您的注释中可以清楚地看到,您使用了错误的数组类型。

Ada端的数组是指向uu_8的指针数组。但是,在C端,需要使用__u8*,即指向__u8值的指针。类型不兼容。

在C中,数组通常作为指向第一个元素的指针传递。这里的情况就是这样。因此,您在Ada端实际需要的是一个包含uu_8值的数组:

代码语言:javascript
复制
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函数可以修改数组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51373246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档