назначение c коротким Аде short_integer - PullRequest
1 голос
/ 18 марта 2019

Мне не хватает чего-то базового в моих представлениях о том, как Ада и печатает.Все, что я хочу сделать, это что-то вроде этого:

    procedure Example(  rec_len : in  interfaces.c.short )  is

        shortLen      : Short_integer   := 0;
        recLen        : integer := 0;

    begin -- example

         shortLen := rec_len;   -- and
         recLen   := shortLen;

         Text_IO.Put_Line( "rec length = "& Integer'IMAGE( recLen ));

    end example;

Другими словами, просто получить целочисленное значение из типа C language short.

в i-c.ads theопределение для short такое же -

     type short is new Short_Integer;

Я не могу найти ссылку или пример, который показывает синтетический сахар, необходимый для выполнения этой простой операции.

В строке:shortLen := rec_len, компилятор GNAT говорит «ожидаемый тип Standard.Short_Integer», что, конечно, так.Однако я не нашел подходящего вызова типа to_Short (), который бы работал. Я понимаю, что это основной вопрос, я все еще думаю, что это должно быть что-то, что я могу найти в документе где-нибудь ( легко ???). Заранее спасибо за ваше ноу-хау.

1 Ответ

5 голосов
/ 18 марта 2019

Ада (в отличие от C) не позволяет назначать значение одного числового типа переменной другого числового типа без явного преобразования.

Это должно работать:

shortLen := Short_Integer(rec_len);
recLen := Integer(shortLen);

Это объявление:

type short is new Short_Integer;

не делает short псевдонимом для Short_Integer (как typedef в C). Это делает short новым и отличным типом, полученным из Short_Integer.

...