首页 > 解决方案 > Ada 保护的 Put 程序不在同一行写入

问题描述

我的问题是我创建了一个 protected Safe_Printer; 但是当我使用它的程序时,它会破坏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;

我的输出是:

 1
 2
 3

 4
 5
 6

 1  2  3
 4  5  6

标签: ada

解决方案


因为该'Image属性返回 a String,所以您在其内部循环中执行Put(M : Matrix)调用;Safe_Printer.Put(S : String)然后每个矩阵条目得到一个New_Line. 一种解决方案是调用Put明确定义的语言Safe_Printer.Put(M : Matrix)

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;

经测试:

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

或者,正如@SimonWright 评论的那样,您可以“删除New_Linein Safe_Printer.Put(String)”。您选择的方法将取决于Safe_Printer规范中提供的所需效果。还要考虑限制use条款的范围。


推荐阅读