2

我在 Ada95 的 ans spec 文件中定义了两个整数范围,如下:

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 是月份类型,我有以下错误

编译:运算符“+”的操作数类型无效

我怎样才能添加这个值来获得一个整数?谢谢!

4

3 回答 3

4

使用类型转换

于 2011-06-16T23:37:19.050 回答
4

当您使用构造X is new时,您正在创建一个新类型。它与其他类型不兼容,应该存在于它自己的宇宙中,在那里它只与其他X类型相互作用。

这意味着您确实必须事先考虑您的打字策略,以确保您可能要对其执行数学运算的所有对象都属于同一类型(在同一个宇宙中运行)。

相反,如果您想要做的是在 的允许范围上设置一个界限X,但允许它在具有其他整数的数学表达式中进行运算,则您应该改用 subtypes,如下所示:

subtype year is integer range 1996..2100;

(注意没有new)。

但是,如果您确实希望Years 和Months 处于它们自己不兼容的宇宙中,但是在这种内部情况下,您需要对它们进行数学转换,那么您可以做的是在这种情况下将它们转换为整数。

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

同样,如果每次将这些对象用于任何事情时都必须这样做,这将是一个主要的 PITA,所以如果是这种情况,它们应该是相同类型的子类型(可能是整数)。

于 2011-06-17T13:05:17.657 回答
2

如前所述,要么使用类型转换,要么使用子类型代替类型。如果您以前没有使用过子类型,请按以下步骤操作:

   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;
于 2011-06-17T11:43:23.637 回答