У меня есть структура C ++ в «MyData.h»
struct MyData
{
int a;
int b;
};
Что я хочу передать указатель на вызов Ада
#include "MyData.h"extern "C" void ada_call(MyData* data);
void func()
{
MyData* data = new MyData();
ada_call(data);
}
Как я могу построить функцию Ада, которая будет принимать это?
Решение имеет пару шагов к нему.
Вам нужно создать запись Ada для этой структуры. G ++ имеет встроенный инструмент для этого. Бежать:
g++ -c -fdump-ada-spec "MyData.h" -C
И вы получите mydata_h.ads, в котором есть определение записи, соответствующей вашей структуре. Это должно выглядеть так:
with Interfaces.C; use Interfaces.C;
package MyData_h is
type MyData is record
a : aliased int; -- MyData.h:3
b : aliased int; -- MyData.h:4
end record;
pragma Convention (C_Pass_By_Copy, MyData); -- MyData.h:1
end MyData_h;
Если у вас есть это, вам нужно написать процедуру, которая принимает его в качестве параметра. Эта процедура должна быть передана как «доступ», затем она должна быть экспортирована, чтобы она была доступна из C.
data_function.ads:
with MyData_h;
use MyData_h;
package DATA_FUNCTION is
procedure ADA_CALL ( DATA : access MyData_h.MyData );
pragma Export(Convention=>C,Entity=>ADA_CALL,External_Name=>"ada_call");
end DataFunction;
data_function.adb
with MyData_h;
use MyData_h;
with Interfaces.C; use Interfaces.C;
package body DATA_FUNCTION is
procedure ADA_CALL ( DATA : access MyData_h.MyData )
begin
DATA.a = 1;
DATA.b = 2;
end ADA_CALL;
end DATA_FUNCTION;