#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).