ada - 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
解决方案
因为该'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_Line
in Safe_Printer.Put(String)
”。您选择的方法将取决于Safe_Printer
规范中提供的所需效果。还要考虑限制use
条款的范围。
推荐阅读
- django - Django rest框架IntegrityError(1048,“列'Board_id'不能为空”)
- ios - `firebase.dynamicLinks().getInitialLink()` 的排毒 iOS 动态链接为空
- c# - 如何使用 Linq 根据一个相等的值和一个不同的值删除重复项?
- database - 在 Delphi CE 中针对 Sqlite3 获得负自动增量值
- python - 在输入索引处加入用户输入
- google-cloud-firestore - 向 SwiftUI 搜索栏添加多个搜索条件?
- amazon-web-services - AWS 私有子网 EC2 上的 SMTP,网络无法访问 [errorno 101]
- powerbi - 将日期与工作日匹配,PowerBI
- css - 在自定义样式组件模板字符串上运行 stylelint
- java - 使用 JNI 将 float[] 从 C++ 传递到 Java