интерфейс — Ada в C ++: передать 64-разрядное значение без знака

Мне нужно передать 2 куска данных из программы Ada в некоторый код C ++ для обработки.

  • Данные — двойные.
  • Время — без знака 64 бита.

Мне удалось создать процедуру в Ada, которая работала с моим методом C ++, используя Long_Float (double в C ++) и Integer (int в C ++, хотя, очевидно, не 64-битные).
Я использовал следующий код (код не для меня, так что синтаксис может быть немного отключен):

procedure send_data (this : in hidden_ptr; data : in Long_Float; time : in Integer);
pragma import (CPP, send_data, "MyClass::sendData");

Теперь, когда это работает, я пытаюсь расширить время до полных 64-битных и в идеале хотел бы иметь длинную unsigned long на стороне C ++. Я не вижу никаких типов в Аде, которые соответствуют этому, поэтому я создал свой собственный тип:

type U64 is mod 2 ** 64;

При использовании этого типа с моим методом send_data я получаю сообщение об ошибке, в котором говорится, что нет никаких возможных способов сопоставить этот тип с типом C ++ (что-то в этом роде, опять же, нет кода или точной фразы ошибки на мне).

Есть ли способ передать пользовательский тип в Ada в C ++? Возможно, есть другой тип в Ada, который я мог бы использовать как 64-разрядное значение без знака, которое будет работать? Есть ли способ передать адрес моего типа U64 в качестве параметра методу C ++, если это проще? Я использую зеленый компилятор adamulti v3.5 (очень новый для ada, не уверен, помогает ли эта информация или нет). Примеры будут с благодарностью!

6

Решение

В качестве дополнения к комментарию / ответу @ KeithThompson …

Официально поддерживаемые типы интерфейса C Ada находятся в Interfaces.C, и там нет никаких длинных int или unsigned (в версии 2005 года. Официальная версия 2012 года еще?).

Вы правильно сделали, чтобы обойти это. Если ваш компилятор этого не поддержал, нужно будет принять более решительные меры.

Первая очевидная вещь, которую нужно попробовать — передать 64-битный тип int по ссылке. Это потребует изменений на стороне C, хотя.

Я знаю, что структуры C / C ++ TIME имеют тенденцию быть 64-битными значениями, определяемыми как объединенные структуры. Итак, что вы можете сделать, это определить запись Ada для имитации одной из этих структур C, убедиться, что она выложена так, как это делает C (например, с помощью представления записи и размера), а затем сделать этот объект тем, для чего используется ваша импортированная подпрограмма. его параметр.

После этого вам придется использовать неприятные трюки с параметрами. Например, вы можете попробовать изменить сторону параметра импорта Ada для 64-разрядного числа с плавающей запятой, unchecked_converting фактического параметра в 64-разрядное число с плавающей точкой и попытаться передать его таким образом. Проблема заключается в том, что много проходов ЦП плавает в разных регистрах, чем в целых. Так что это, скорее всего, не сработает, и если это произойдет, то, безусловно, не является переносимым.

Вполне возможно, что есть и другие способы его подделать, если вы выясните, как работает соглашение о вызовах CPP вашего компилятора. Например, если он использует два смежных 32-разрядных регистра для передачи 64-разрядных значений, вы можете разделить 64-разрядное целое число Ada на два и передать его в двух параметрах на стороне Ada. Если он передает 64-битные значения по ссылке, вы можете просто сообщить стороне Ada, что вы передаете указатель на ваш U64. Опять же, эти решения не будут портативными, но они помогут вам.

1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector