Ada保护的Put程序不';不要写在同一行
我的问题是我创建了一个受保护的Ada保护的Put程序不';不要写在同一行,ada,Ada,我的问题是我创建了一个受保护的Safe_打印机;但是当我使用它的过程时,它会弄乱Put函数。每次打印到新行时。我怎样才能防止这种情况发生?基本上,我想用它以可读的格式打印我的矩阵 这是我的密码: with Ada.Text_IO; use Ada.Text_IO; procedure main is type Matrix is array(integer range <>, integer range <>) of integer; protect
Safe_打印机
;但是当我使用它的过程时,它会弄乱Put
函数。每次打印到新行时。我怎样才能防止这种情况发生?基本上,我想用它以可读的格式打印我的矩阵
这是我的密码:
with Ada.Text_IO;
use Ada.Text_IO;
procedure main is
type Matrix is array(integer range <>, integer range <>) of integer;
protected Safe_Printer is
procedure Put(S: String);
procedure Put(M: Matrix);
end Safe_Printer;
protected body Safe_Printer is
procedure Put(S: String) is
begin
for I in S'range loop
Put(S(I));
end loop;
New_Line;
end Put;
procedure Put(M:Matrix) is
begin
for I in m'range(1) loop
for j in m'range(2) loop
put(integer'image(m(i,j)) & " ");
end loop;
new_line(1);
end loop;
end Put;
end Safe_Printer;
m:Matrix := ((1,2,3),
(4,5,6));
begin
Safe_Printer.Put(m);
for I in m'range(1) loop
for j in m'range(2) loop
put(integer'image(m(i,j)) & " ");
end loop;
new_line(1);
end loop;
end main;
由于该属性返回一个字符串
,因此Put(M:Matrix)
的实现在其内部循环中调用Safe\u Printer.Put(S:String)
;然后,每个矩阵项都会得到一个新行
。一种解决方案是在Safe\u打印机中显式调用定义的语言Put
。Put(M:Matrix)
:
经测试:
with Ada.Text_IO;
use Ada.Text_IO;
procedure main is
type Matrix is array(integer range <>, integer range <>) of integer;
protected Safe_Printer is
procedure Put(S : String);
procedure Put(M: Matrix);
end Safe_Printer;
protected body Safe_Printer is
procedure Put(S : String) is
begin
for I in S'range loop
Put(S(I));
end loop;
New_Line;
end Put;
procedure Put(M : Matrix) is
begin
for I in M'range(1) loop
for j in M'range(2) loop
Ada.Text_IO.Put(integer'image(M(i,j)) & " ");
end loop;
New_Line;
end loop;
end Put;
end Safe_Printer;
M : Matrix := ((1,2,3),
(4,5,6));
begin
Safe_Printer.Put(M);
end main;
带有Ada.Text\u IO;
使用Ada.Text\u IO;
主要程序是
类型矩阵是整数的数组(整数范围,整数范围);
打印机是受保护的安全打印机
程序Put(S:字符串);
程序Put(M:矩阵);
终端安全打印机;
受保护的身体安全打印机
过程Put(S:字符串)为
开始
对于S'范围循环中的I
付诸表决(S(I));
端环;
新线;
端置;
程序Put(M:矩阵)为
开始
对于M'range(1)循环中的I
对于M'范围(2)回路中的j
Ada.Text_IO.Put(整数图像(M(i,j))和“);
端环;
新线;
端环;
端置;
终端安全打印机;
M:矩阵:=((1,2,3),
(4,5,6));
开始
安全打印机。放置(M);
端干管;
控制台:
$ ./main
1 2 3
4 5 6
美元/主要
1 2 3
4 5 6
或者,您可以“在
Safe\u打印机中删除New\u行
。放置(字符串)
”。您选择的方法将取决于Safe\u打印机
规范中提供的所需效果。还考虑限制<代码>使用< < /C> >子句。 不应在受保护对象内调用“潜在阻止操作”。调用Text\u IO.Put
可能是一个阻塞操作。参见《美国残疾人协会参考手册》第9.5.1节。我很惊讶你的编译器竟然没有抱怨
在这种情况下,可以使用任务而不是受保护的对象
例如:
带有Ada.Text\u IO;
主要程序是
类型矩阵是整数的数组(整数范围,整数范围);
任务安全\u打印机正在运行
输入Put(S:字符串形式);
输入Put(M:矩阵中);
终端安全打印机;
任务体安全\u打印机正在运行
S:访问字符串;
M:接入矩阵;
开始
环
选择
接受Put(字符串中的)do
Safe_Printer.S:=新字符串(S'范围);
安全打印机S.all:=S;
结束;
Ada.Text_IO.Put_线(全部);
或
接受Put(矩阵中的M)do
Safe_Printer.M:=新矩阵(M'范围(1),M'范围(2));
Safe_Printer.M.all:=M;
结束;
对于M'Range(1)循环中的I
对于M'范围(2)回路中的J
Ada.Text_IO.Put(整数图像(M(I,J))和“”);
端环;
Ada.Text\u IO.New\u行;
端环;
或
终止
终端选择;
端环;
终端安全打印机;
M:矩阵:=((1,2,3),
(4,5,6));
开始
安全输出(M);
端干管;
这种方法的另一个优点是,对Text\u IO.Put[\u Line]
的调用实际上与主任务并行执行。缺点是(为了安全起见)要打印的字符串或矩阵被复制
此代码的更好版本可能使用Unchecked\u Deallocation
或Ada.Containers.unfinite\u holder
来很好地清理自身
额外问题:您认为
Main
过程中矩阵M
的数组边界是什么?或者您可以在Safe\u打印机中删除New\u行,如副本所示,我从原始的main
中删除了它。我想既然没有注释说明Put(String)
应该做什么,我们就不能说任何一种方式!但我们可以将其与Text\u IO
进行比较,并决定同时使用Put
(无终端换行)和Put\u Line
谢谢您的回答,没有想到我的新Put过程会覆盖原程序。从技术上讲,这是“过载”!
with Ada.Text_IO;
use Ada.Text_IO;
procedure main is
type Matrix is array(integer range <>, integer range <>) of integer;
protected Safe_Printer is
procedure Put(S : String);
procedure Put(M: Matrix);
end Safe_Printer;
protected body Safe_Printer is
procedure Put(S : String) is
begin
for I in S'range loop
Put(S(I));
end loop;
New_Line;
end Put;
procedure Put(M : Matrix) is
begin
for I in M'range(1) loop
for j in M'range(2) loop
Ada.Text_IO.Put(integer'image(M(i,j)) & " ");
end loop;
New_Line;
end loop;
end Put;
end Safe_Printer;
M : Matrix := ((1,2,3),
(4,5,6));
begin
Safe_Printer.Put(M);
end main;
$ ./main
1 2 3
4 5 6