Ada到C++:传递一个无符号的64位值
Ada to C++: Pass an unsigned 64-bit value
我需要将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
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 使用无符号int作为二进制来在c++中实现一个集
- 为无符号字符* 分配一个数字
- 给定一个无符号整数,很容易交换每个偶数位和奇数位。这可以推广到交换每个偶数和奇数n位吗?
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 将无符号整数加法/减法括在一个范围周围
- 如果我想将一个无符号整数四舍五入到最接近的更小或等于偶数的整数,我可以除以2然后乘以2吗
- 最快的函数将位置设置为一个无符号整数中两个位之间的位
- Ada到C++:传递一个无符号的64位值
- 递归地构造一个无符号int的变量模板
- 从int c++的向量返回一个无符号长
- 声明一个无符号int和一个数组的无序映射(将具有不同的大小)
- 如果我有一个固定大小的填充ascii数字的char数组,我知道它指的是一个无符号整数,那么将其转换为无符号整数的最快方法
- 我们可以分配一个无符号的int变量,0xFULL文字吗
- 如何在Protobuf中声明一个无符号的long-long
- 你能把一个有符号的char数组转换成一个无符号的整数吗
- 我如何分配一个浮点变量到一个无符号int变量,位图像,不强制转换
- 我可以将向量的第一个元素的地址直接传递给一个函数吗?该函数需要一个无符号字符作为其输入
- 在c++中是否正确地将两个无符号32位整数合并为一个无符号64位整数?
- 是否将一个无符号整数右移其总位数UB