質問

私は完全なエイダ初心者です。ただし、HS中に2〜3年間Pascalを使用しました。

IIRCでは、C / C ++からPascalコンパイル済み関数を呼び出すことができます。手続きを呼び出すことは可能ですかC ++からAdaで書かれた関数?

役に立ちましたか?

解決

この古いチュートリアルによれば、それは可能であるはずです。

ただし、このスレッドでは、c ++ extern" C"に注意する必要があります。 Ada関数の定義。

他のヒント

これは、g ++ / gnatmake 5.3.0を使用した例です。

注:C ++とAdaの間でデータを渡すときは注意してください

ada_pkg.ads

    package Ada_Pkg is
        procedure DoSomething (Number : in Integer);
        pragma Export (C, DoSomething, "doSomething");
    end Ada_Pkg;

ada_pkg.adb

    with Ada.Text_Io;
    package body Ada_Pkg is
        procedure DoSomething (Number : in Integer) is
        begin
            Ada.Text_Io.Put_Line ("Ada: RECEIVED " & Integer'Image(Number));
        end DoSomething;
    begin
        null;
    end Ada_Pkg;

main.cpp

    /*
    TO BUILD:
    gnatmake -c ada_pkg
    g++ -c main.cpp
    gnatbind -n ada_pkg
    gnatlink ada_pkg -o main --LINK=g++ -lstdc++ main.o
    */

    #include <iostream>

    extern "C" {
        void doSomething (int data);
        void adainit ();
        void adafinal ();
    }

    int main () {
        adainit(); // Required for Ada
        doSomething(44);
        adafinal(); // Required for Ada 
        std::cout << "in C++" << std::endl;
        return 0;
    }

参照:

そのようなことは常に行われます。コツは、ルーチンに「C」スタイルの呼び出しプロトコルを使用するように両側に指示することです。 C ++では、これはextern&quot; C&quot;で行われます。宣言、およびプラグマExport(&quot; C&quot ;, ...

を使用したAda側

詳細については、それぞれのお気に入りの参照元で調べてください。ポインターおよび参照パラメーターに注意してください!

絶対に可能です。過去5年間、私はC ++とAdaを組み合わせたシステムに取り組んできました。

はい。数年前、私はそれを証明するために短い簡単なデモを書きました。 DLLは2つあり、1つはC ++で記述され、もう1つはAdaで記述されていました。浮動小数点値に定数を追加しただけです。 C ++とAdaの2つのアプリは、それぞれ両方のDLLを使用しました。したがって、Adaから呼び出される/呼び出されるC ++のすべての可能な組み合わせが存在しました。すべてうまくいきました。これは、Windowsでその時点で最新のバージョンでした。覚えていないが、これはLinuxやBeOSで動作するかもしれない。

ここからソースコードを見つけることができたら...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top