打印整数数组在 Ada 中生成奇怪的输出

kik*_*key 1 arrays int gcc ada

我创建了一个简单的 Ada 程序,它允许用户用最多 100 个非负和非零整数填充数组,然后将它们打印出来。当我调用函数来打印数字时,它会打印出它们,但同时它也会打印出一堆奇怪且看似随机的数字。我在代码中犯了什么错误导致程序输出如此奇怪的结果?这是我第一次用 Ada 写作。例如,当我用数字 [1,2,3,4,5] 填充空数组时,会打印出以下内容:

    1
          2
          3
          4
          5
      32624
  911328835
      32624
  911328836
      32624
   67043328
  134217726
  134217726
 2013265921
  134217726
  134217726
  134217726
   67043328
  909181968
      32624
 2114692683
      89452
  914381552
      32624
 1543503876
          2
         14
          2
         14
Run Code Online (Sandbox Code Playgroud)

我在 ubuntu 上使用 gnatmake 编译器,在编译源代码时,它没有给我任何错误/警告消息。

这是我的源代码,我知道我可能不需要使用单独的函数,但我还是出于学习目的实现了它们。

with Ada.Containers.Vectors;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
use Ada.Containers;


procedure thing is 
type Vector is array (1..100) of Integer;
A: Vector;--array doesn't need to be completely filled up

K: Integer;
--array filling function below
function mkarr return Vector is --asks user to fill empty array with positive and non zero integers

begin

Ada.Text_IO.Put ("enter numbers to fill array, negative or 0 will stop process: ");
for I in 1..100 loop
    Ada.Integer_Text_IO.Get(K);
    if K>0 then
        A(I) := K;
    end if;
    if K<=0 then
        return A;
    end if;

end loop;
return A;
end;




--array printing prodcedure below
procedure printarr(A: in out Vector) is
begin
    for I in A'Range loop
    if A(I)>0 then
        Ada.Integer_Text_IO.Put(A(I));
        New_Line(1);
    end if;
    end loop;
end printarr;



B: Vector := mkarr;


--main method below
begin



printarr(A);
end thing;
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 6

在 中mkarr,您使用 0 或负值来标记输入的结尾,但不将该值存储在数组中。如果在您输入的值结束后存储在数组中的任何垃圾恰好是正数,则无法判断它不是有效值。

在 中printarr,如果您遇到 0 或负值,则不会打印它——但您会继续打印剩余的正值(这是垃圾)。

如果您将标记值存储在 中mkarr,并在printarr遇到标记时退出打印,则程序应该可以工作。

其他一些注意事项:

A并且K只在内部使用mkarr。他们应该是本地的mkarr

你从不使用Ada.Containers.Vectors. 您可以删除相应的withuse指令。

对于更高级的用法,您可以mkarr通过创建Vector一个不受约束的数组类型并返回一个切片来返回一个仅包含输入数据的数组。在mkarr. 允许任意多个输入是一种技巧——但Ada.Containers可能是一种很好的方式来做到这一点。(免责声明:我没有看过Ada.Containers。)