Ada Integer'宽度错误
Ada Integer'Width error
我有这个 Ada 包代码,理论上写得很好:
with Ada.Text_IO;
with Ada.Characters.Handling;
package body pkg_procedure is
procedure Read_Integer(Num : out Integer) is
Intro : constant Character := ASCII.LF;
Back : constant Character := ASCII.Del;
Char : Character;
Fin : Boolean := False;
Number : Natural := 0;
String_Number : String (1 .. Integer'Width – 1);
begin
Ada.Text_IO.New_line;
Ada.Text_IO.Put ("Write down a number and press Enter: ");
while not Fin loop
Ada.Text_IO.Get_Immediate (Char);
if Ada.Characters.Handling.Is_Digit (Char) then
Number := Number + 1;
String_Number(Number) := Char;
Ada.Text_IO.Put (Char);
elsif Char = Intro then
Fin := True;
elsif Number > 0 and Char = Back then
Ada.Text_IO.Put (ASCII.BS & ' ' & ASCII.BS);
Number := Number + 1;
end if;
end loop;
Number := Integer'Value (String_Number (1 .. Number));
Ada.Text_IO.New_line;
Num := Number;
exception
when Constraint_Error =>
Ada.Text_IO.New_line;
Ada.Text_IO.Put_Line ("Sorry: " & String_Number & " is too long to store it");
Num := 0;
end Read_Integer;
end pkg_procedure;
当我编译程序时,我收到一条关于这条指令的错误消息:binary operator expected
。
我无法修复它。我对这种编程语言完全陌生。
我怀疑您向我们提供了错误的代码部分,如下所示
with Ada.Text_Io; use Ada.Text_Io;
procedure TestInt is
number : String (1 .. Integer'Width - 1);
begin
Put_Line("Width=" & Integer'Image(Integer'Width - 1));
end TestInt;
效果很好,如果我们忽略未使用的数字警告,并且 return 如预期的那样:
Width= 10
请更准确地提供完整的可编译示例。
我可能也很想告诉我们您使用哪个编译器以及在哪个操作系统上使用。
问题原来是
中的-
String_Number : String (1 .. Integer'Width – 1);
不是普通的 -
而是编码为 e28093
- EN DASH.
的宽字符
我发现这个是因为看到各种探索性更改没有显示错误,我恢复到您的原始版本并尝试使用 -gnatw8
(输入为 UTF-8)和 [=16 进行编译=] 用于将消息与程序文本混合,导致
13. String_Number : String (1 .. Integer'Width – 1);
12
>>> binary operator expected
>>> illegal wide character
我有这个 Ada 包代码,理论上写得很好:
with Ada.Text_IO;
with Ada.Characters.Handling;
package body pkg_procedure is
procedure Read_Integer(Num : out Integer) is
Intro : constant Character := ASCII.LF;
Back : constant Character := ASCII.Del;
Char : Character;
Fin : Boolean := False;
Number : Natural := 0;
String_Number : String (1 .. Integer'Width – 1);
begin
Ada.Text_IO.New_line;
Ada.Text_IO.Put ("Write down a number and press Enter: ");
while not Fin loop
Ada.Text_IO.Get_Immediate (Char);
if Ada.Characters.Handling.Is_Digit (Char) then
Number := Number + 1;
String_Number(Number) := Char;
Ada.Text_IO.Put (Char);
elsif Char = Intro then
Fin := True;
elsif Number > 0 and Char = Back then
Ada.Text_IO.Put (ASCII.BS & ' ' & ASCII.BS);
Number := Number + 1;
end if;
end loop;
Number := Integer'Value (String_Number (1 .. Number));
Ada.Text_IO.New_line;
Num := Number;
exception
when Constraint_Error =>
Ada.Text_IO.New_line;
Ada.Text_IO.Put_Line ("Sorry: " & String_Number & " is too long to store it");
Num := 0;
end Read_Integer;
end pkg_procedure;
当我编译程序时,我收到一条关于这条指令的错误消息:binary operator expected
。
我无法修复它。我对这种编程语言完全陌生。
我怀疑您向我们提供了错误的代码部分,如下所示
with Ada.Text_Io; use Ada.Text_Io;
procedure TestInt is
number : String (1 .. Integer'Width - 1);
begin
Put_Line("Width=" & Integer'Image(Integer'Width - 1));
end TestInt;
效果很好,如果我们忽略未使用的数字警告,并且 return 如预期的那样:
Width= 10
请更准确地提供完整的可编译示例。 我可能也很想告诉我们您使用哪个编译器以及在哪个操作系统上使用。
问题原来是
中的-
String_Number : String (1 .. Integer'Width – 1);
不是普通的 -
而是编码为 e28093
- EN DASH.
我发现这个是因为看到各种探索性更改没有显示错误,我恢复到您的原始版本并尝试使用 -gnatw8
(输入为 UTF-8)和 [=16 进行编译=] 用于将消息与程序文本混合,导致
13. String_Number : String (1 .. Integer'Width – 1);
12
>>> binary operator expected
>>> illegal wide character