下面的程序假设从用户那里获得字符输入,并将其放入记录中,子程序过程Get(Tecken:out Record_Type)。最后一步是使用另一个子程序程序放置(Chars:in Chars_Array)在终端中打印它。
我面临的问题是我到达终端的角色的实际输出:
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;
答案 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
为真时,返回的字符是该行的最后一个字符。