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