Ада-95. Компилятор GNAT



         

Примеры организации взаимодействия с C


Простым примером импорта C-функции может служить пример использования функции read системы UNIX в процедуре, написанной на Аде:

procedure Read( File_descriptor : in Integer; Buffer : in out String; No_Bytes : in Integer; No_Read : out Integer) is

function Read( File_descriptor : Integer; Buffer : System.Address; No_Bytes : Integer) return Integer;

pragma Import(C, read, "read");

begin

No_Read := Read(File_descriptor, Buffer(Buffer'First)'Address, No_Bytes); end Read;

Проблема связи с C возникает в ситуации, когда необходимо взаимодействовать с функциями которые имеют список параметров с переменным числом параметров неоднородного типа.

Примером такой функции может служить C-функция printf.

Необходимо отметить, что подобные функции, по своей природе, не надежны, и не существует удовлетворительного способа решения этой проблемы.

Однако, Ада позволяет взаимодействовать с функциями, имеющими переменное число параметров, но при этом тип параметров однороден.

Для взаимодействие с такими функциями можно использовать типы неограниченных (unconstrained) массивов.

Предположим, что существует функция, написанная на C, описание которой имеет следующий вид:

void something(*int[]);

Мы можем использовать эту функцию в Аде следующим образом:

type Vector is array(Natural range <>) of Integer;

procedure Something(Item : Vector) is

function C_Something(Address : System.Address); pragma Import(C, C_Something, "something");

begin

if Item'Length = 0 then

C_Something(System.Null_Address); else

C_Something(Item(Item'First)'Address); end if; end Something;

Рассмотрим более сложный пример, который демонстрирует использование C-функции execv системы UNIX, описанную в C следующим образом:

int execv(const char *path, char *const argv[]);

В данном случае, дополнительную сложность вызывает необходимость трансляции Ада-строк в массивы символов C-стиля.

Перед тем как описывать непосредственную реализацию, необходимо сделать некоторые описания:




Содержание  Назад  Вперед