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