Ada中未初始化变量差异的技术解释?

时间:2015-06-23 16:55:08

标签: arrays ada

据我所知,Ada中未初始化的变量未定义,所以它可以是任何东西。通常,编译器会阻止您使用未初始化的变量,因为这很愚蠢。在玩移动数组时,我注意到GNAT会让我访问现在未初始化的数组成员。对于左移,新的最右边的成员将是0,而对于右移,新的最左边的成员将是6512352.无论数组的大小,或者移动了多少,它都保持为真。

这些数字是否有技术解释?

所有测试均在Intel x64上完成。我的AMD x64机器坏了,几天前我的RaspPi坏了。

转移实施:

function Shift(Source : in Static_Array;
               Toward : in Direction;
               By : in Positive := 1)
               return Static_Array is
    Result : Static_Array(Source'Range);
begin
    case Toward is
        when Left =>
            Result(Result'First .. Result'Last-By) :=
                Source(Source'First+By .. Source'Last);
        when Right =>
            Result(Result'First+By .. Result'Last) :=
                Source(Source'First .. Source'Last-By);
    end case;
    return Result;
end Shift;

在测试文件中:

A : Static_Array := (1, 2, 3, 4, 5, 6, 7, 8);

结果:

test results

结果来自测试程序。第一件事是运行的是什么,在结果之后是什么,在=之后是" s"期望"。由于该值未初始化且未定义,我只需输入0即可。

1 个答案:

答案 0 :(得分:2)

未初始化的数组组件包含执行前内存中的所有残余。虚假值可能看似刻板,部分原因在于生成的代码分配堆栈帧的方式。浏览生成的assembly source可能会有所帮助。更改执行环境通常会改变结果。我看到各种数组大小的明显差异。尝试使用-On更改优化级别。使用特定于平台的内存更改命令,例如purge,看看效果。