【发布时间】:2012-09-12 08:32:35
【问题描述】:
我需要将 2 条数据从 Ada 程序传递给一些 C++ 代码进行处理。
- 数据 - 双倍。
- 时间 - 无符号 64 位。
我能够使用 Long_Float(C++ 中的双精度)和 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 compiler v3.5(对ada来说非常新,不确定该信息是否有帮助)。示例将不胜感激!
【问题讨论】:
-
mod 2 ** 64应该是正确的。当我使用带有 GNAT 的类型编译您的示例时,它不会抱怨。也许您的 Ada 编译器不认为 C++(或它所针对的 C++ 编译器)支持 64 位无符号类型;标准 C++ 直到 2011 年 ISO 标准才获得unsigned long long。 -
@KeithThompson - 呸!让你的这些优秀的 cmets 回答 Keith,所以我的支持是有意义的,我可以适当地评论他们,如果他们最终成为答案,他们可以被接受。
-
您可以尝试添加
pragma Convention (CPP, U64);。 -
您的时间实际上是一个字段还是包含秒和毫秒字段的记录结构?如果是这样,您可以轻松地将其拆分为 2 个参数...
-
而不是
unsigned long long,在不同的实现中可能有不同的大小,试试std::uint64_t。