Matrix Ada:数组范围上for循环中的索引具有意外值

Matrix Ada:数组范围上for循环中的索引具有意外值,matrix,ada,Matrix,Ada,问题陈述 我想迭代矩阵中的每个元素并显示: 元素值 元素索引(I,J) 下面的代码提供了以下输出: (-2147483648, -2147483648) = 1.00000E+00 (-2147483648, -2147483647) = 2.00000E+00 (-2147483648, -2147483646) = 3.00000E+00 (-2147483647, -2147483648) = 4.00000E+00 (-2147483647, -2147483647) =

问题陈述

我想迭代矩阵中的每个元素并显示:

  • 元素值
  • 元素索引(I,J)
下面的代码提供了以下输出:

(-2147483648, -2147483648) =  1.00000E+00
(-2147483648, -2147483647) =  2.00000E+00
(-2147483648, -2147483646) =  3.00000E+00
(-2147483647, -2147483648) =  4.00000E+00
(-2147483647, -2147483647) =  5.00000E+00
(-2147483647, -2147483646) =  6.00000E+00
我希望看到1而不是-2147483648,2而不是-2147483647

示例代码

with Ada.Numerics.Real_Arrays; use Ada.Numerics.Real_Arrays;
with Ada.Text_IO;              use Ada.Text_IO;

procedure Index is
   Matrix : Real_Matrix := (( 1.0, 2.0, 3.0 ),
                            ( 4.0, 5.0, 6.0 ));
begin
   for I in Matrix'Range(1) loop
      for J in Matrix'Range(2) loop
         Put_Line("(" & Integer'Image(I) & ", " &
                   Integer'Image(J) & ") = " &
                   Float'Image(Matrix(I, J)));
      end loop;
   end loop;
end Index;

Real\u Matrix
的索引类型是
Integer
,它从平台上的
-2147483648
开始,解释了您看到的数字。但是,由于类型是无约束的,因此可以在数组聚合中指定自己的索引:

Matrix : Real_Matrix := ( 1 => ( 1 => 1.0, 2 => 2.0, 3 => 3.0 ),
                          2 => ( 1 => 4.0, 2 => 5.0, 3 => 6.0 ));

Real\u Matrix
的索引类型是
Integer
,它从平台上的
-2147483648
开始,解释了您看到的数字。但是,由于类型是无约束的,因此可以在数组聚合中指定自己的索引:

Matrix : Real_Matrix := ( 1 => ( 1 => 1.0, 2 => 2.0, 3 => 3.0 ),
                          2 => ( 1 => 4.0, 2 => 5.0, 3 => 6.0 ));

显然,实矩阵类型使用
Integer
作为其索引类型,如果没有另外指定,则默认值为
Integer'First
。在Ada中,我们鼓励您声明并使用适合您的问题的自己的类型,因此声明一个数组类型(沿着实数矩阵的线条),使用Natural(从0开始)或Positive(您得到它)或Range子类型,显然,Real_矩阵类型使用
Integer
作为其索引类型,如果没有另外指定,默认值是
Integer'First
。在Ada中,我们鼓励您声明并使用适合您的问题的自己的类型,因此请声明一个数组类型(沿着实数矩阵的线条),使用Natural(从0开始)或Positive(您得到它)或Range子类型,并使用它。感谢egilhh和Brian的快速响应!感谢egilhh和Brian的快速回复!