gpt4 book ai didi

ada - 如何使用传递引用参数将 C 函数导入 Ada?

转载 作者:行者123 更新时间:2023-12-04 03:11:19 25 4
gpt4 key购买 nike

我有一个 C 函数 int func( int a, int* b)我需要在 Ada 95 中导入和使用。其中 C 函数通常在 C 中调用为 c = func(a, &b);
我一直将 C 函数导入 Ada,但总是避免使用带有传递引用参数的函数,但终于到了学习的时候了。

我想知道如何在 Ada 中声明这个函数,还想知道如何使用它与显示的声明变量一起使用的快速示例(因为我对 Access 类型仍然有点模糊)。

谢谢大家!

最佳答案

在 C 中,int* b可以意味着很多事情。也许它真的只是一个指向一个变量的指针,但它也可能是一个数组,其中 int a是长度。此代码假定 int* b实际上只是一个通过引用传递的值:

with Interfaces.C;

-- ...
package C renames Interfaces.C;

function Func (A : C.int; B : access C.int) return C.int;
pragma Import (Convention => C, Entity => Func,
External_Name => "func");

-- ...

declare
A : C.int := 42;
B : aliased C.int := 23;
C : C.int;
begin
C := Func (A, B'Access);
-- ...
end;

您可以使用 'Accessaliased变量。只要您确定指针不会存储在 C 端并在变量 B 生命周期结束后访问,这就是安全的。 . (如果 C 声明使用 const 关键字,您可以在 Ada 端使用 access constant,但这仅限于 Ada 2005。)

您还可以使用命名类型:
-- ...
type Int_Access is access C.int;
function Func (A : C.int; B : Int_Access) return C.int;
-- ...
C := Func (A, B'Unchecked_Access);
-- ...

现在我们需要使用 'Unchecked_Access因为 Ada 通常不允许非本地访问类型(如 Int_Access )引用本地变量。如果您知道 C 代码将如何处理指针(就像您应该做的那样),您可以使用命名类型来指定不应传递对局部变量的引用。

备注 1:如果您有一个过程(在 C 中:一个返回 void 的函数),您可以使用 in out 指定要通过引用传递的变量。在您的 Ada 程序声明中而不是 access .这样,您根本不需要担心访问类型。和以前一样,您需要确保指针没有存储在 C 端。

注意事项 2:记录类型和数组无论如何都是通过引用传递的 - 除非你指定 pragma Convention (C_Pass_By_Copy, Your_Type); .这是在 Ada 中包装 C 函数时的常见问题。

关于ada - 如何使用传递引用参数将 C 函数导入 Ada?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11190048/

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