此 comp.lang.ada 消息表明您至少需要-gnato -fstack-check
命令行选项才能使 Gnat 成为兼容的 Ada 编译器。
但这不是这里的问题:编译器确实会警告范围错误;与 Gnat 我得到:
gnatmake -gnato -fstack-check question
question.adb:3:35: warning: static value out of range of type "Standard.Natural"
question.adb:3:35: warning: "Constraint_Error" will be raised at run time
以及运行时的明显错误。
在这种情况下,因为范围是静态的,编译器可能已经捕获了错误;但正如您所猜测的那样,通常直到运行时才能完全确定类型,如下例所示。
with Ada.Text_IO;
with Ada.Command_Line;
procedure question is
subtype Arguments is Natural range 1 .. Ada.Command_Line.Argument_Count;
begin
for i in Arguments loop
Ada.Text_IO.Put_Line ("Argument " & integer'image(i) &
" is " & Ada.Command_Line.Argument(i));
declare
OneArg : constant String := Ada.Command_Line.Argument(i);
subtype Characters is Natural range OneArg'range;
begin
null; -- process the string here
end;
end loop;
end;
在您运行程序之前,这两个子类型都不知道。
声明块显示了一个我觉得非常有用的相关模式,它不仅允许可变 [子] 类型,而且在堆栈上分配可变大小的对象,以便在每次循环迭代时自动回收和重新调整大小。(您可以像在其他语言中一样使用“new”进行分配,并使用“unchecked_deallocation”进行免费分配,但很多时候,就像这里一样,根本不需要)