gpt4 book ai didi

c - Ada程序调用c函数interfaces.c.size_t有问题

转载 作者:行者123 更新时间:2023-12-04 11:09:26 24 4
gpt4 key购买 nike

我一直在从事 Ada 项目,需要与 C 库 (fftw3) 进行交互。我用了命令

gcc -c -fdump-ada-spec -C /usr/local/include/fftw3.h

生成初步绑定(bind)(需要进行一些调整)。我能够让我的代码和 fftw3_h.ads 在 gnat 中编译。但是,程序崩溃了

raised STORAGE_ERROR : fftw3_h.ads:733 object too large

当我通过 gdb 运行它时,代码在定义版本字符串的行上崩溃,

fftw_version : aliased char_array (size_t);  -- /usr/local/include/fftw3.h:457
pragma Import (C, fftw_version, "fftw_version");

我对此的理解是,Ada 试图一次为整个字符串分配空间,并且存储空间基于 size_t 的范围。但是,在这种情况下,size_t 来自 interfaces.c.size_t,它被定义为

type size_t is mod 2 ** System.Parameters.ptr_bits;

在 i-c.ads 中,而对于 C,size_t 在 stddef.h 中被定义为 unsigned long。我不确定 2**ptr_bits 有多大,但我看不出有任何理由将 i-c.ads 中 size_t 的定义限制为 C 的 unsigned long 的大小。如果它比 C 的 unsigned long 长,那么我怀疑代码正在尝试创建一个使用比我拥有的更多内存的数组。我尝试只使用 interfaces.c.unsigned_long 而不是 size_t,但 Ada 不喜欢类型不匹配(我早该知道)。

此时,我有两个问题。首先,我对问题的理解是否接近(这是我第一次在 Ada 和 C 之间进行交互)。

其次,假设我的理解是正确的,是否有办法解决这个问题,或者我是否需要采取完全不同的方法?

最佳答案

谢谢大家。西蒙的回答真的很有帮助。一个问题是 fftw_version[] 是在 fftw 的 C 代码中设置的,不是我设置的,我不能保证在 fftw 库中的某些东西需要它之前调用该过程(fftw3_h.ads 在我的任何代码之前详细说明) .我还发现了 Stephen J. Sangwine 于 2004 年在线发布的旧 FFTW_Ada 绑定(bind)。虽然我无法让他的代码工作,但我将他处理版本字符串的方式与 Simon 的建议结合起来,并创建了一个函数,该函数在 fftw 库中的其他内容需要时返回该字符串。

function FFTW_Version return String is
tmp_version : aliased char_array(size_t) ;
pragma Import(C, tmp_version, "fftw_version");
begin
return To_Ada(tmp_version, Trim_Nul => True) ;
end FFTW_Version;

这给了我一些东西,可以在需要时生成字符串,但不会对字符串的大小做出假设(FFTW_Ada 代码所做的)。这编译和工作得很好。

关于c - Ada程序调用c函数interfaces.c.size_t有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55033651/

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