gpt4 book ai didi

types - 为什么 Ada 编译器会让范围违规通过?为什么我的类型声明是运行时实体?

转载 作者:行者123 更新时间:2023-12-01 10:02:17 25 4
gpt4 key购买 nike

为什么 Ada 编译器允许范围违规通过?它确实给出了警告,但是如果它在任何情况下都是错误的,为什么它让它通过呢?是否存在一种实用的行为?

最重要的是:为什么类型声明是运行时实体?我的意思是代码示例的第 3 行是我希望提前评估的内容。我认为只有第 5 行会“使它”成为可执行文件。为什么不?那东西有用吗?我是否在这里遗漏或误解了某些内容?

with Ada.Text_IO;
procedure question is
subtype Test is Natural range -1 .. 10;
begin
Ada.Text_IO.Put_Line ("foobar");
end;

注意:结果与“type Test is new Natural range -1..10;”相同

注意:GNAT 4.6

最佳答案

This comp.lang.ada message建议您至少需要 -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;

在您运行程序之前,这两个子类型都不知道。

declare block 显示了一个我觉得非常有用的相关模式,它不仅允许可变 [sub] 类型,而且在堆栈上分配可变大小的对象,以便在每次循环迭代时自动回收和重新调整大小。 (您可以像在其他语言中一样使用“new”进行分配,并使用“unchecked_deallocation”进行释放,但很多时候,就像这里一样,根本不需要)

关于types - 为什么 Ada 编译器会让范围违规通过?为什么我的类型声明是运行时实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com