Ada至C++;:传递一个无符号的64位值 我需要把2个数据从艾达程序传递到一些C++代码进行处理。 数据-双 时间-无符号64位 我能用艾达的方法在C++中使用一个Lang-Fuffin(双C++)和整数(C++中的int,显然不是64位)。 我使用了以下代码(代码不在我身上,因此语法可能有点不正确): 现在,我正在努力把时间扩展到64位,并且理想的是在C++端有一个无符号长的长。我在Ada中没有看到任何与之匹配的类型,因此我创建了自己的类型: type U64 is mod 2 ** 64; 当用我的SeNDYDATA方法使用那个类型时,我会发现一个错误,说没有可能把那个类型映射到C++类型(沿着这些线,再没有代码或确切的错误短语)。 有没有办法将艾达中的用户定义类型传递给C++?也许Ada中还有另一种类型可以用作无符号的64位值,可以使用吗?有没有办法将我的U64类型的地址作为参数传递给C++方法,而不是更容易?我正在使用green hills adamulti编译器v3.5(ada非常新,不确定该信息是否有用)。我们将不胜感激

Ada至C++;:传递一个无符号的64位值 我需要把2个数据从艾达程序传递到一些C++代码进行处理。 数据-双 时间-无符号64位 我能用艾达的方法在C++中使用一个Lang-Fuffin(双C++)和整数(C++中的int,显然不是64位)。 我使用了以下代码(代码不在我身上,因此语法可能有点不正确): 现在,我正在努力把时间扩展到64位,并且理想的是在C++端有一个无符号长的长。我在Ada中没有看到任何与之匹配的类型,因此我创建了自己的类型: type U64 is mod 2 ** 64; 当用我的SeNDYDATA方法使用那个类型时,我会发现一个错误,说没有可能把那个类型映射到C++类型(沿着这些线,再没有代码或确切的错误短语)。 有没有办法将艾达中的用户定义类型传递给C++?也许Ada中还有另一种类型可以用作无符号的64位值,可以使用吗?有没有办法将我的U64类型的地址作为参数传递给C++方法,而不是更容易?我正在使用green hills adamulti编译器v3.5(ada非常新,不确定该信息是否有用)。我们将不胜感激,c++,interface,ada,C++,Interface,Ada,作为@KeithThompson评论/回答的附录 Ada官方支持的C接口类型在中,并且没有超长的int或unsigned(在2005版本中。2012版本正式吗?) 你做了正确的事情来解决这个问题。如果您的编译器不支持这一点,则必须采取更严厉的措施 第一个显而易见的尝试是通过引用传递64位int。不过,这需要在C端进行更改 我知道C/C++时间结构往往是64位的值,定义为联合结构。因此,您可以定义一个Ada记录来模拟其中一个C结构,确保它按照C的方式进行布局(例如:使用记录表示和大小子句),然后使

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

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

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

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

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

在那之后,你将不得不耍些下流的参数把戏。例如,您可以尝试将参数的Ada导入端更改为64位浮点,将实际参数转换为64位浮点,并尝试以这种方式传递。存在的问题是,许多CPU的pass浮动在不同于int的寄存器中。所以这很可能行不通,如果它真的这样做了,它肯定是不可移植的


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

mod 2**64
应该是正确的。当我用GNAT编译您的示例时,它不会抱怨。也许你的艾达编译器不认为C++(或者C++编译器目标)支持一个64位的无符号类型;标准C++没有得到<代码>未签名的长long < /代码>,直到2011 ISO标准。@ KeththppsPon BAH!对你的答案做出这些好的评论Keith,这样我的投票就有了意义,我可以对它们进行适当的评论,如果它们最终成为答案,它们就可以被接受。您的时间实际上是一个字段,还是一个包含秒和毫秒字段的记录结构?如果是这样的话,你可以很容易地把它分成两个参数…今天有一点时间再次使用它@Simon Wright不幸的是,pragma约定(CPP,U64)在添加时没有明显的效果,我尝试的所有操作都收到了相同的错误。感谢KeithThompson和T.E.D.的建议。我尝试创建一个“类型U64_ptr is access U64”,并将U64_ptr作为指针传递,而不是将U64类型作为值传递。我收到同样的错误,没有兼容的C++类型映射到U64。我还尝试了一个unChigkdl转换为long OFLUP,将其传递给C++侧的一个双倍,并将其转换为一个未签名的长long,并接收到一些不稳定的值(不是我所期望的,没有进一步研究)。我会继续玩它,当我可以和回任何信息,我可以找到,再次感谢@Xeleot—“Funky values”通常表示一方的解引用次数多于另一方。@Xeleot—“Funky values”你确定你没有跨越大/小端点边界吗?@nw这是一个很好的建议,但我检查了位,我认为这不是问题所在。我和团队讨论了这个问题,我们决定采取简单的方法,传递2个32位的值。只是在C++方面做了一个方法,把它们放在一起作为一个64位整数,然后调用我们原来想要的方法。我讨厌放弃这样一个实在的问题,但最后期限不是我的朋友。再次感谢大家的帮助!
type U64 is mod 2 ** 64;