Передать указатель на структуру C ++ в Ada

У меня есть структура 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);
}

Как я могу построить функцию Ада, которая будет принимать это?

2

Решение

Решение имеет пару шагов к нему.

Вам нужно создать запись 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;
2

Другие решения