Постоянная декларация в Аде - PullRequest
3 голосов
/ 04 июля 2010

Будучи новичком в Ada, я изучаю его синтаксис и правила и хотел бы обратить внимание на приведенный далее код.Здесь я пытаюсь установить переменную Actual_Stiffness для хранения постоянного значения.Его значение определяется произведением:

Actual_Stiffness := Stiffness_Ratio * Stiffness_Total

, где Stiffness_Total была определена как постоянная Long_Float в файле спецификации Material_Data.ads, а Stiffness_Total уже имеет значение, установленное в файле объявлений.

WITH Ada.Text_IO;
WITH Ada.Long_Float_Text_IO;
WITH Material_Data;
USE Material_Data;

PROCEDURE sample IS

   Stiffness_Ratio  : Long_Float;
   Actual_Stiffness : CONSTANT Long_Float :=  Stiffness_Ratio * Stiffness_Total;

BEGIN -- main program
   Ada.Text_IO.Put("Enter stiffness ratio: ");
   Ada.Long_Float_Text_IO.Get(Item => Stiffness_Ratio);
   Ada.Long_Float_Text_IO.Put(Item => Stiffness_Ratio);

   --Ada.Text_IO.New_Line;
   --Ada.Long_Float_Text_IO.Put(Item => Actual_Stiffness);
   --Ada.Text_IO.New_Line;
   --Ada.Long_Float_Text_IO.Put(Item => Stiffness_Total);
END sample;

При компиляции я получаю предупреждающее сообщение

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

и при запуске программы Actual_Stiffness не получает правильное значение.Я мог бы определить Actual_Stiffness как просто Long_Float (без добавления CONSTANT), а затем получить его значение из продукта Actual_Stiffness: = Stiffness_Ratio * Stiffness_Total после BEGIN в моей программе, когда Stiffness_Ratio уже получил бы значение.Это было бы правильно.

Мой вопрос:

Я определил Stiffness_Total как константу Long_Float с заданным значением.Как определить, что Actual_Stiffness также должен быть постоянным (поскольку он не будет изменяться в программе), сохраняя при этом возможность для пользователя в интерактивном режиме вводить Stiffness_Ratio на терминале?Это вообще возможно сделать?

Спасибо большое ..

1 Ответ

2 голосов
/ 04 июля 2010

Поскольку «Stiffness_Ratio» не определяется до времени выполнения, компилятор не может вычислить значение «Actual_Stiffness» во время компиляции, как вы его просили. Вам нужно будет преобразовать Actual_Stiffness в непостоянную переменную и инициализировать его вычислением после того, как Stiffness_Ratio получит значение. (Вы даже можете сохранить его как ПОСТОЯННОЕ внутри функции, если коэффициент жесткости имеет значение в момент вычисления фактической жесткости.)

Это стандарт для большинства языков программирования.

Итак, чтобы ответить на ваш вопрос:

  • Нет, вы не можете определить Actual_Stiffness как желаемую константу.

  • Приблизительно близкое приближение состоит в том, что вы определяете значение Stiffness_Ratio вне этой процедуры и передаете это значение в процедуру как параметр. Но тогда Actual_Stiffness является постоянным только на время процедуры, а не на все время.

С другой стороны, это, вероятно, будет более полезным; кто-то может запустить программу с несколькими значениями коэффициента жесткости в разное время, тем самым выполняя множество симуляций за один прогон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...