CONSTRAINT_ERROR с «ошибка проверки индекса»

#ada #gnat

#ada #gnat

Вопрос:

Я создаю интерпретатор арифметических выражений в Ada.

Пример ввода: «ДОБАВИТЬ a b; ДОБАВИТЬ b c; PRN c; SUB c a; PRN c;»

У меня длинный код, поэтому я не хочу копировать все это, вместо этого я пытаюсь объяснить короткую часть этого, где я получил ошибку.

‘s’ — это состояние, представленное записью, с полем ‘Size’ и массивом, называемым выражениями. Выражение представлено записью с полями: Op (тип перечисления), LHS и RHS (символы).
Функция notSpaceLinSearch находит индекс первого элемента во входной строке, который не является пробелом.

Итак, мой вопрос в том, почему могла возникнуть ошибка, и почему только в 5-й раз ссылки на индекс?

Заранее спасибо за ваши ответы.

 while loopIndex <= numOfExpressions loop
         s.Size := s.Size   1;
         notSpaceLinSearch(charArray, ' ', contains, notSpaceIndex);
         foundChar := charArray(notSpaceIndex);
         case foundChar is
            when 'A' => s.Expressions(s.Size).Op := ADD;
            when 'S' => s.Expressions(s.Size).Op := SUB;
            when 'M' => s.Expressions(s.Size).Op := MUL;
            when 'P' => s.Expressions(s.Size).Op := PRN;
            when 'I' => s.Expressions(s.Size).Op := INI; -- raised CONSTRAINT_ERROR .... index check failed
            when others => null;
         end case;
....
....
...
end loop;
  

Комментарии:

1. Если проверка индекса не удалась, индекс ( s.Size ) не был в пределах s.Expressions . И, возможно, вам нужно учитывать это значение по умолчанию null в инструкции case, учитывая, что вы увеличили значение s.Size безоговорочно.

2. Возможно, вы захотите использовать Ada.Containers.Vectors вместо массива, поскольку вы не будете заранее знать требуемый размер массива; вы можете добавить к Vector , и он предоставляет Length функцию, что делает его возможной заменой вашей комбинации массив / размер.

Ответ №1:

Спасибо за ответы, проблема заключалась в неправильной инициализации массива выражений. (N-1 вместо N).