Domanda

Sono un principiante di Ada, anche se ho usato Pascal per 2-3 anni durante HS.

IIRC, è possibile chiamare funzioni compilate Pascal da C / C ++. È possibile chiamare procedure & amp; funzioni scritte in Ada dal C ++?

È stato utile?

Soluzione

Secondo questo vecchio tutorial , dovrebbe essere possibile.

Tuttavia, come illustrato da questa discussione , devi fare attenzione con il c ++ extern & C; quot " definizioni delle funzioni Ada.

Altri suggerimenti

Ecco un esempio usando g ++ / gnatmake 5.3.0:

NOTA: fai attenzione quando passi i dati tra C ++ e 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;
    }

References:

Questo genere di cose viene fatto continuamente. Il trucco è dire ad entrambe le parti di usare un protocollo di chiamata in stile "C" per la routine. In C ++ questo viene fatto con "C" esterno dichiarazioni e nella parte Ada con pragma Export (" C " ;, ...

Cerca quelli nelle tue rispettive fonti di riferimento preferite per i dettagli. Fai attenzione ai parametri puntatore e riferimento!

Assolutamente possibile. Negli ultimi cinque anni ho lavorato su un sistema che mescola C ++ e Ada.

Sì. Diversi anni fa ho scritto una breve demo semplice per dimostrarlo. C'erano due DLL, una scritta in C ++ e l'altra in Ada. Hanno appena aggiunto costanti ai valori in virgola mobile. Due app, una in C ++ e una in Ada, utilizzavano entrambe la DLL. Quindi esisteva ogni possibile combinazione di chiamata / chiamata C ++ da Ada. Tutto ha funzionato bene. Questo era su Windows qualunque versione fosse attuale al momento; Non ricordo, ma potrebbe aver funzionato su Linux o BeOS.

Ora, se solo potessi trovare il codice sorgente da quello ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top