Недопустимые типы для операнда "+" Ada 95 - PullRequest
2 голосов
/ 17 июня 2011

Я определил два целочисленных диапазона в файле спецификации 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 ]

4 голосов
/ 17 июня 2011

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

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

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

subtype year is integer range 1996..2100;

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

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

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

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

4 голосов
/ 17 июня 2011

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

2 голосов
/ 17 июня 2011

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

   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;
...