当您要从特定年份循环到另一年时,for循环在Ada中如何工作?

问题描述

我真的不理解Ada编程中的for循环,尽管我可以在c ++中使用它。例如,在Ada中,您应该编写for I in 0..7 loop,但是如果您编写for I in 0..year loop,则会出现编译器错误,指出year不兼容。因此,如果要从特定年份循环到另一特定年份,应该如何在Ada中使用for循环?可以说我希望我的代码看起来像这样。但是,它将无法编译。

  with Ada.Text_IO;                    use Ada.Text_IO;
  with Ada.Integer_Text_IO;            use Ada.Integer_Text_IO;
  with Ada.Float_Text_IO;              use Ada.Float_Text_IO;

 procedure Population is
  Min,Max: Integer;
  type percent is range Min..Max;
begin
for I in percent'Range loop
    Put_Line("I is "& percent'Image(I));
 end loop;
 end Population;

解决方法

回答原始的不完整的问题;忽略后面完全不相关的示例。范围的两端必须为同一类型。然后循环变量将自动为该类型。

您的错误消息表明year是新类型,而不是Integer,例如

type years is new integer range 0 .. 2020;
year : years := 1999;  -- party like its 1999

如果文字0处于您年份类型的范围内,这仍然会起作用,因为整数文字是与所有整数类型兼容的假设类型“ Universal Integer”。如果超出范围,则在运行时会出现Constraint Error异常,Gnat编译器将在编译过程中发出警告。

如果另一个整数变量V在您的年份类型范围内,则可以通过类型转换years(V)使V成为年份。

再次,如果V超出范围,则会产生运行时后果;但是,除非V的类型范围与年份范围不重叠,否则编译器无法提前发出警告。

当然,for i in year1 .. year2很好,其中year1year2都是years类型。

但是,如果您将大量地混合使用整数和年份,请使year为整数的子类型,而不是新的类型。安全性较低,但更方便。它将超出范围值,但是如果您混合使用整数和年份,就不会抱怨...

subtype years is integer range 0 .. 2020;

任何离散类型都可以用作循环变量,并且/或者可以对数组进行索引:其中包括枚举

for i in Boolean'range loop
   put_line(Boolean'image(i));
end loop;

应打印

现在要知道一个有用的事情:每当声明一个数组时,您还声明了一个唯一类型(严格来说是子类型),该类型为该数组建立​​索引。可以用作循环变量...

for i in my_array'range loop
   do_something_with(my_array(i));
end loop;

哪个不能在数组外索引...