int的打印数组会在ada中生成奇怪的输出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了int的打印数组会在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
我在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;
在mkarr
中,您使用0或负值来标记输入的结尾,但是您不将该值存储在数组中。如果在您输入的值的结尾之后数组中存储了任何垃圾,而这些垃圾恰好是正数,则无法分辨出它不是有效值。
在printarr
中,如果遇到0或负值,则不打印它-但您将继续打印其余的正值(这是垃圾)。
如果遇到前哨时将前哨值存储在mkarr
中,并在printarr
中退出打印,则程序应该可以工作。
一些其他说明:
A
和K
仅在mkarr
内部使用。它们应该在mkarr
本地。
您从不使用Ada.Containers.Vectors
。您可以删除相应的with
和use
指令。
[更高级的用法,您可以使mkarr
成为不受约束的数组类型并返回一个切片,从而使Vector
返回仅包含输入数据的数组。在mkarr
内定义固定长度的数组仍然更加容易。允许任意输入很多都是骗人的-但是Ada.Containers
可能是实现此目的的好方法。 (免责声明:我没有看过Ada.Containers
。)
展开Keith’s answer:您需要一个可变长度的结果,因此更像Ada的方法是使用“无约束数组”:
type Vector is array (Positive range <>) of Integer;
这意味着您可以创建任意大小的数组实例,只要边界为正:1 .. 100,42 .. 43等。您甚至可以通过指定最后一个来创建零长度数组界限(称为’Last
)小于第一个界限(称为’First
)。在这种特殊情况下,您可以在索引类型范围之外使用’Last
(在这种情况下,如果您要使人们感到困惑,则可以使用0,甚至是-42!)。
function mkarr return Vector is
我们必须有一个实际的数组来累加值,所以将上限设置为100。
Result : Vector (1 .. 100);
我们需要知道有多少个元素。
Count : Integer := Result'First - 1;
与以前差不多,
K : Integer;
begin
Ada.Text_IO.Put
("enter numbers to fill array, negative or 0 will stop process: ");
for I in Result'Range loop
我们最多可以返回一个包含Result’Length
个元素的数组。
Ada.Integer_Text_IO.Get (K);
if K > 0 then
我们可以再添加一个元素。
Count := Count + 1;
Result (Count) := K;
else
少于100个元素,因此仅返回该切片。
return Result (Result'First .. Count);
end if;
end loop;
我们已经累计了100个结果,因此请全部退回。
return Result;
end mkarr;
以上是关于int的打印数组会在ada中生成奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 的类中生成一个数字给我一个奇怪的错误 [重复]