Ada95循环记录中的数组并打印字符

Ada95循环记录中的数组并打印字符,ada,Ada,下面的程序假定从用户处获取字符输入,并使用子程序get(Tecken:out Record_Type)将其放入记录中。最后一步是使用另一个子程序Procedure Put(Chars:in Chars\u Array)在终端中打印它 我面临的问题是将字符实际输出到终端,在那里我得到: 下面是从数组中打印字符的子程序。当涉及到记录和数组时,我很困惑,但我认为我需要一个数组作为参数,因为我不能循环记录 procedure Put(Chars : in Char_Array) is --

下面的程序假定从用户处获取字符输入,并使用子程序get(Tecken:out Record_Type)将其放入记录中。最后一步是使用另一个子程序Procedure Put(Chars:in Chars\u Array)在终端中打印它

我面临的问题是将字符实际输出到终端,在那里我得到:



下面是从数组中打印字符的子程序。当涉及到记录和数组时,我很困惑,但我认为我需要一个数组作为参数,因为我不能循环记录

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

begin

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

end Put;   

这里是另一个颠簸的地方,我使用一个参数“Chars”进行Put调用。字符数组是否识别“Tecken”中的输入


编译器发出了一点警告:

poster.adb:31:04: warning: variable "Chars" is read but never assigned
这是因为
Get
写入
Tecken.Chars
;传递给
Put
Chars
与此无关,并且填充了随机数据

你说“我想我需要一个数组作为参数,因为我不能循环记录”。是的,您不能循环通过记录,但可以循环通过作为记录一部分的数组

如果你说

Put(Tecken.Chars);
虽然在实际输入之后仍然会收到垃圾,但情况会更好。如果你说

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

这是因为
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
并不像您希望的那么容易,因为当
End\u Of
为true时,返回的字符是行中的最后一个。

您是否填写了过程
Get
Tecken.Chars
中的所有位置?这一切都取决于用户。我已经添加了“在\行的\结束时退出”;以确定是否按下了Enter键。我只尝试过像“asdfg”这样的随机输入来检测我接收到的输出。您如何确保使用
Put
输出的内容不会比
Get
读取的内容多?这看起来像是您真的想使用
Ada.Strings.Bounded
最大值为256。当我添加Put时(Tecken.Chars(1..Tecken.Length))调用,并且“procedure Put(Tecken:in Record_Type)”的子程序开始于上面的注释。我在调用和子程序内部都添加了要告诉我的内容,但我得到了错误消息:“第9行定义的预期类型“Record_Type”第6行定义的“find Type”Char_Array“编译器正在抱怨Record_类型和Tecken。Chars显然是Record_类型,还是我错了?在更改
Put
的定义后,调用应该是
Put(Tecken)
Tecken
是一种
记录类型
,而
Tecken.Chars
是一种
Char\u数组
   Put(Tecken.Chars (1 .. Tecken.Length));
$ ./poster 
0123456789

raised CONSTRAINT_ERROR : poster.adb:36 range check failed
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);