簡體   English   中英

Ada to C++:傳遞一個無符號的 64 位值

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

我需要將 2 條數據從 Ada 程序傳遞給一些 C++ 代碼進行處理。

  • 數據 - 雙倍。
  • 時間 - 無符號 64 位。

我能夠在 Ada 中使用 Long_Float(C++ 中的雙精度數)和 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++ 端有一個 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接口類型在Interfaces.C中 ,並且沒有超長的int或unsigned(在2005版本中。2012版本官方了嗎?)。

你做了正確的事情來解決它。 如果您的編譯器不支持,則必須采取更激烈的措施。

首先要嘗試的是通過引用傳遞64位int。 這將需要在C方面進行更改。

我知道C / C ++ TIME結構往往是64位值,定義為聯合結構。 所以你可以做的是定義一個Ada記錄來模仿其中一個C結構,確保它按照C的方式布局(例如:帶有記錄表示和大小子句),然后使該對象成為導入例程用於的對象它的參數。

在那之后你將不得不采取討厭的參數技巧。 例如,您可以嘗試將參數的Ada導入端更改為64位浮點數,將實際參數unchecked_converting為64位浮點數,然后嘗試以這種方式傳遞。 問題在於,很多CPU的通過浮動在不同的寄存器中而不是整數。 所以這可能不會起作用,如果它確實如此,那么大多數都不可移植。

如果您弄清楚編譯器的CPP調用約定是如何工作的,那么可能還有其他方法可以偽造它。 例如,如果它使用兩個相鄰的32位寄存器來傳遞64位整數,則可以將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));

結果:第一個 = -9223372036854775808 最后一個 = 9223372036854775807

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM