10

処理のために、AdaプログラムからいくつかのC++コードに2つのデータを渡す必要があります。

  • データ-double。
  • 時間-符号なし64ビット。

Long_Float(C ++ではdouble)とInteger(C ++ではint、明らかに64ビットではありません)を使用して、C++メソッドで機能するプロシージャをAdaで作成できました。私は次のコードを使用しました(コードは私にはないので、構文が少しずれている可能性があります):

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

これでうまくいったので、時間を完全な64ビットに拡張しようとしています。理想的には、C++側でunsignedlonglongを使用したいと考えています。Adaにそれに一致するタイプがないので、独自のタイプを作成しました。

type U64 is mod 2 ** 64;

その型をsend_dataメソッドで使用すると、その型をC ++型にマップする方法がないというエラーが表示されます(これらの行に沿ったもので、コードや正確なエラーフレーズがありません)。

Adaのユーザー定義型をC++に渡す方法はありますか?おそらく、Adaには、機能する符号なし64ビット値として使用できる別のタイプがありますか?簡単な場合は、代わりにU64タイプのアドレスをパラメーターとしてC ++メソッドに渡す方法はありますか?私はgreenhillsadamultiコンパイラv3.5を使用しています(adaは非常に新しいので、その情報が役立つかどうかはわかりません)。例をいただければ幸いです。

4

2 に答える 2

1

@KeithThompsonのコメント/回答への補遺として...

Ada が公式にサポートしている C インターフェイスの型はInterfaces.Cにあり、そこには余分な長さの int や unsigned はありません (2005 バージョンでは。2012 バージョンはまだ公式ですか?)。

あなたはそれを回避するために正しいことをしました。コンパイラがそれをサポートしていない場合は、より抜本的な対策を講じる必要があります。

最初に試みる明白なことは、参照によって 64 ビットの int を渡すことです。ただし、C 側の変更が必要になります。

私は、C/C++ TIME 構造体が 64 ビット値である傾向があり、結合された構造体として定義されることを知っています。したがって、これらの C 構造体の 1 つを模倣するように Ada レコードを定義し、C と同じように配置されていることを確認し (例: レコード表現とサイズ句を使用)、そのオブジェクトをインポートしたルーチンが使用するものにすることができます。そのパラメータ。

その後、厄介なパラメータ トリックを実行する必要があります。たとえば、パラメータの Ada インポート側を 64 ビット float に変更し、実際のパラメータを unchecked_converting して 64 ビット float に変換し、そのように渡すことを試みることができます。そこにある問題は、多くの CPU のパスが int とは異なるレジスタに浮動することです。したがって、それはおそらく機能しません。

コンパイラの CPP 呼び出し規則がどのように機能するかがわかれば、それを偽装する他の方法があるかもしれません。たとえば、2 つの隣接する 32 ビット レジスタを使用して 64 ビット int を渡す場合、Ada 64 ビット int を 2 つに分割し、Ada 側の 2 つのパラメーターで渡すことができます。参照によって 64 ビット値を渡す場合は、U64 へのポインターを渡していることを Ada 側に伝えることができます。繰り返しますが、これらのソリューションは移植可能ではありませんが、あなたを動かすでしょう.

于 2012-09-20T13:57:34.010 に答える