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