如何解决当您要从特定年份循环到另一年时,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
很好,其中year1
和year2
都是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;
哪个不能在数组外索引...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。