Недопустимые типы для операнда "+" Ada 95

Я определил два целочисленных диапазона в ANS-файле спецификации Ada95 следующим образом:

type year is new integer range 1996..2100;
type month is new integer range 1..12;

Когда я компилирую код файла тела, у меня есть строка кода, подобная этой:

....
    key: integer;
begin 
    key:= (yearVal*100) + monthVal;

YearVal это тип года, а monthVal это тип месяца, у меня следующая ошибка

компиляция: недопустимые типы операндов для оператора "+"

Как я могу добавить эти значения, чтобы получить целое число? Спасибо!

3 ответа

Решение

Когда вы используете конструкцию X is new Вы создаете новый тип. Он несовместим с другими типами и должен существовать в своего рода вселенной, где он взаимодействует только с другими X типы.

Это означает, что вам действительно нужно заранее продумать свою стратегию набора текста, чтобы убедиться, что все объекты, для которых вы хотите выполнить математику, относятся к одному типу (работающему в одной и той же вселенной).

Если вместо этого вы хотели ограничить допустимый диапазон X, но разрешите ему работать в математических выражениях с другими целыми числами, вместо этого вы должны использовать подтипы, например:

subtype year is integer range 1996..2100;

(примечание нет new).

Однако, если вы действительно хотите Year с и Month Для того, чтобы находиться в их собственных несовместимых вселенных, но есть один внутренний случай, когда для преобразований вам нужно делать с ними математику, то, что вы можете сделать, это преобразовать их в целые числа в этом одном случае.

key:= (Integer(yearVal)*100) + Integer(monthVal);

Опять же, это будет основной PITA, если вам придется делать это каждый раз, когда вы используете эти объекты для чего-либо, поэтому, если это так, они должны быть подтипами одного типа (вероятно, Integer).

Используйте преобразование типов.

Как указывалось ранее, либо используйте преобразование типа, либо используйте подтип вместо типа. Если вы еще не использовали подтип, вот как:

   subtype year is Integer range 1996 .. 2100;
   subtype month is Integer range 1 .. 12;
   yearVal : year;
   monthVal : month;

Тогда вы можете свободно делать:

   key : Integer;
begin
   key := (yearVal*100) + monthVal;
Другие вопросы по тегам