Ada95在Record中循环播放数组并打印字符

时间:2017-10-29 11:25:42

标签: ada

下面的程序假设从用户那里获得字符输入,并将其放入记录中,子程序过程Get(Tecken:out Record_Type)。最后一步是使用另一个子程序程序放置(Chars:in Chars_Array)在终端中打印它。

我面临的问题是我到达终端的角色的实际输出:

Picture of the Output

procedure Poster is

type Char_Array is                            -- Fält/Array
    array (1..256) of Character;

type Record_Type is                           -- Post/Record
    record
        Chars : Char_Array;
        Length : Integer;
    end record;
procedure Get(Tecken : out Record_Type) is   -- Character input

begin

    for I in 1..256 loop
        Get(Tecken.Chars(I));
        exit when End_Of_Line;
    end loop;

end Get;      

这是从阵列中打印字符的子程序。我对记录和数组感到困惑,但我认为我需要一个数组作为参数,因为我无法遍历记录。

procedure Put(Chars : in  Char_Array) is   -- Character output

begin

    for I in 1..256 loop
        Put(Chars(I));
    end loop;

end Put;   

这是路上的另一个颠簸,我使用参数" Chars"看跌期权。 Char_Array是否识别" Tecken" ?

Tecken : Record_Type;
Chars : Char_Array; 

begin

    Get(Tecken);
    Put(Chars);

end Poster;

1 个答案:

答案 0 :(得分:1)

编译器发出了一些警告:

poster.adb:31:04: warning: variable "Chars" is read but never assigned

这是因为Get写入Tecken.Chars;您传递给Chars的{​​{1}}与此无关,并且随机数据填充。

你说"我认为我需要一个数组作为参数,因为我无法循环记录"。没错,你不能遍历记录,但你可以循环遍历记录的数组。

如果你说

Put
事情变得更好,尽管在实际输入后你仍然会得到垃圾。如果你说

,你可能会期望更好
Put(Tecken.Chars);

   Put(Tecken.Chars (1 .. Tecken.Length));

这是因为$ ./poster 0123456789 raised CONSTRAINT_ERROR : poster.adb:36 range check failed 实际上并未设置Get

修好后[*],这应该可以解决问题

Tecken.Length

现在,电话只是

procedure Put (Tecken : in  Record_Type) is
begin
   for I in 1 .. Tecken.Length loop
      Put (Tecken.Chars(I));
   end loop;
end Put;

[*]修复Put (Tecken); 并不像你希望的那样容易,因为当Get为真时,返回的字符是该行的最后一个字符。