gpt4 book ai didi

c++ - Ada 到 C++ : Pass an unsigned 64-bit value

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:19 24 4
gpt4 key购买 nike

我需要将 2 条数据从 Ada 程序传递给一些 C++ 代码进行处理。

  • 数据 - 双倍。
  • 时间 - 无符号 64 位。

我能够使用 Long_Float(在 C++ 中为 double)和 Integer(在 C++ 中为 int,但显然不是 64 位)在 Ada 中创建一个与我的 C++ 方法一起工作的过程。我使用了以下代码(代码不在我身上,所以语法可能略有偏差):

procedure send_data (this : in hidden_ptr; data : in Long_Float; time : in Integer);
pragma import (CPP, send_data, "MyClass::sendData");

现在它正在运行,我正在尝试将时间扩展到完整的 64 位,并且理想情况下希望在 C++ 端有一个 unsigned long long。我在 Ada 中没有看到任何匹配的类型,所以我创建了自己的类型:

type U64 is mod 2 ** 64;

在我的 send_data 方法中使用该类型时,我收到一条错误消息,指出无法将该类型映射到 C++ 类型(类似的情况,同样没有代码或确切的错误短语)。

有没有办法将 Ada 中的用户定义类型传递给 C++?也许 Ada 中还有另一种类型可以用作无符号的 64 位值?如果更容易的话,有没有办法将我的 U64 类型的地址作为参数传递给 C++ 方法?我正在使用 green hills adamulti 编译器 v3.5(对于 ada 来说非常新,不确定该信息是否有帮助)。示例将不胜感激!

最佳答案

作为@KeithThompson 的评论/回答的附录...

Ada 官方支持的 C 接口(interface)类型在 Interfaces.C 中,并且那里没有超长整型或无符号(在 2005 版本中。2012 版本正式了吗?)。

您做了正确的事情来解决它。如果您的编译器不支持,则必须采取更严厉的措施。

要尝试的第一个显而易见的事情是通过引用传递 64 位 int。不过,这将需要在 C 端进行更改。

我知道 C/C++ TIME 结构往往是 64 位值,定义为 union 结构。所以你可以做的是定义一个 Ada 记录来模仿那些 C 结构之一,确保它按照 C 的方式进行布局(例如:使用记录表示和大小子句),然后使该对象成为你导入的例程使用的对象它的参数。

之后,您将不得不使用讨厌的参数技巧。例如,您可以尝试将参数的 Ada 导入端更改为 64 位 float ,unchecked_converting_converting 实际参数为 64 位 float ,并尝试以这种方式传递它。那里的问题是很多 CPU 的 pass float 在与 int 不同的寄存器中。所以这可能行不通,如果行得通,那肯定是不可移植的。

如果您弄清楚编译器的 CPP 调用约定是如何工作的,那么很可能还有其他方法来伪造它。例如,如果它使用两个相邻的 32 位寄存器来传递 64 位整数,您可以将 Ada 64 位整数拆分为两个,并在 Ada 端将其传递到两个参数中。如果它通过引用传递 64 位值,您可以告诉 Ada 端您正在传递一个指向 U64 的指针。同样,这些解决方案不可移植,但它们可以让您继续前进。

关于c++ - Ada 到 C++ : Pass an unsigned 64-bit value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504774/

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