Ошибка Ada Integer'Width - PullRequest
       10

Ошибка Ada Integer'Width

0 голосов
/ 26 апреля 2018

У меня есть этот код пакета 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.

Я не могу это исправить. Я совершенно новичок в этом языке программирования.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Проблема заключается в том, что - в

    String_Number : String (1 .. Integer'Width – 1);

- это не простой -, а широкий символ с кодировкой e28093 - EN DASH .

Я обнаружил это, потому что, увидев, что различные исследовательские изменения не показывали ошибку, я вернулся к вашему оригиналу и попытался скомпилировать с -gnatw8 (входной сигнал - UTF-8), а также -gnatl для смешивания сообщений с текст программы, в результате чего

13.         String_Number : String (1 .. Integer'Width – 1);
                                                      12
    >>> binary operator expected
    >>> illegal wide character
0 голосов
/ 26 апреля 2018

Я подозреваю, что вы предоставили нам неправильную часть вашего кода, как это

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;

работает как брелок, если мы проигнорируем предупреждение о неиспользованном номере и вернемся, как ожидается:

Width= 10

Пожалуйста, будьте точнее и предоставьте полный скомпилированный образец. Мне также может быть интересно рассказать нам, какой компилятор вы используете и в какой операционной системе.

...