Ada到C++:传递一个无符号的64位值

Ada to C++: Pass an unsigned 64-bit value

本文关键字:一个 无符号 64位值 C++ Ada      更新时间:2023-10-16

我需要将Ada程序中的两段数据传递给一些C++代码进行处理。

  • 数据-双精度
  • 时间-无符号64位

我能够在Ada中使用Long_Float(C++中的double)和Integer(C++中为int,显然不是64位)来制作一个与我的C++方法配合使用的过程。我使用了以下代码(代码不在我身上,所以语法可能有点偏离):

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

现在这已经起作用了,我正试图将时间扩展到完整的64位,理想情况下,我希望在C++端有一个无符号的长整型。我在Ada中没有看到任何与之匹配的类型,所以我创建了自己的类型:

type U64 is mod 2 ** 64;

当我在send_data方法中使用该类型时,我收到一个错误,说没有可能的方法将该类型映射到C++类型(同样,我身上没有代码或确切的错误短语)。

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

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

Ada官方支持的C接口类型在Interfaces.C中,其中没有超长的int或unsigned(在2005版本中。2012版本正式发布了吗?)。

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

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

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

在那之后,你将不得不采取恶劣的参数技巧。例如,您可以尝试将参数的Ada导入端更改为64位浮点,取消选中_将实际参数转换为64位浮动,并尝试以这种方式传递。问题是,很多CPU的pass浮动在与int不同的寄存器中。因此,这很可能不会奏效,如果真的奏效了,它肯定是不可移植的。

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

Put_Line("First = " & Interfaces.C.long'Image(Interfaces.C.long'First));
Put_Line("Last = " & Interfaces.C.long'Image(Interfaces.C.long'Last));

结果:

First = -9223372036854775808
Last =  9223372036854775807
相关文章: