Вопрос

У меня есть запрос с декларативной частью, функцией и пакетами. У меня есть пакет, как показано дальше. Из-за сложности функции Compute_x1 я создаю «Отдельно» для вычисления этой функции. Значение, возвращенное из Compute_x1, равно x1 и должна использоваться в функции J21 (J21 принимает x1 в качестве первого аргумента).

Спецификация пакета:

package Compute_Jacobian is

--compute X1
function Compute_X1 ( Force_Applied, Forcing_Frequency: Long_Float) return Long_Float;

--- use X1 in J21
function J21 ( X1, Forcing_Frequency, Natural_Frequency : Long_Float) return Long_Float;

end Compute_Jacobian;

Тело пакета:

package body Compute_Jacobian is
 --compute X1

function Compute_X1 ( Force_Applied, Forcing_Frequency: Long_Float) return Long_Float is separate;

X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);


function J21 ( X1, Forcing_Frequency, Natural_Frequency : Long_Float) return Long_Float is separate;

end Compute_Jacobian;

И я создал заглушки для Compute_x1 и J21.

При составлении пакета Compute_jacobian.Adb, я получаю это сообщение об ошибке:

12.    X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);
       |
    >>> statement not allowed in declarative part

Мой вопрос заключается в том, как вычислить X1 и использовать его в вычислении функции J21.

Я мог бы попытаться вычислить X1 в «основном» коде (не отображенном здесь) непосредственно (создавая «оттуда» оттуда), а затем используйте его как обычный аргумент в вычислении J21. Но я хотел вышеуказанную структуру (в моем вышеуказанном посте здесь) с вычислением x1 в пакете Compute_jacobian.

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

Это было полезно?

Решение

Ну, компилятор рассказывает вам именно то, что проблема :-)

Вы пытаетесь выполнять Заявление о назначении в регионе Кодекса, который разрешает только декларации.

По крайней мере, я не вижу вашу декларацию X1 (хотя это может быть, потому что вы не выдерживаете его в вышеуказанном коде), и я не вижу объявлений и ценностей, присваиваемых для Force_applied и Forction_Frequency.

Это может быть закреплено так, чтобы он был скомпирован рядом с As-Is:

X1 : Long_Float := Compute_X1 ( Force_Applied, Forcing_Frequency);

Или, добавив блок инициализации в корпус пакета:

package body Computer_Jacobian is
    ...
    X1 : Long_Float;
    ...
begin
   X1 := Compute_X1 ( Force_Applied, Forcing_Frequency);
end Compute_Jacobian;

Но, честно говоря, я действительно не думаю, что ни один из них - это то, что вы действительно хотите.

В вашей главной программе вы можете просто объявить X1 (и переменные, переданные как аргументы), а затем вызывают ваши вычисленные функции, например, (предупреждение, не скомпилированное)

with Compute_Jacobian;
procedure Do_Computations is

  Force_Applied     : Long_Float := 1.0;
  Forcing_Frequency : Long_Float := 10.0;
  Natural_Frequency : Long_Float := 5.0;

  X1  : Long_Float;
  J21 : Long_Float;

begin
   X1  := Compute_Jacobian.Compute_X1 (Force_Applied, Forcing_Frequency);
   J21 := Compute_Jacobian.Compute_J21 (X1, Forcing_Frequency, Natural_Frequency);
end Do_Computations;

Это один подход к получению того, что вы можете искать.

Или, если X1 используется исключительно в пределах Computage_j21, вы должны просто вызвать Compute_x1 как одно из первых операторов, выполненных (или как инициализацию декларации x1) в этой функции (и пропустить Force_applied, вместо x1, в качестве аргумента для Compute_j21):

function Compute_J21 (Force_Applied, 
                      Forcing_Frequency,
                      Natural_Frequency : Long_Float)
                                   return Long_Float is

   -- Declarations...
   X1 : Long_Float := Compute_X1(Force_Applied, Forcing_Frequency);

begin
   -- Computations that utilize X1...

end Compute_J21;

И одна заметка об использовании «является отдельным» ... я понимаю желание установить эти функции реализации в зависимости от их сложности, но я все равно рекомендую против этого. Он просто добавляет другой файл, чтобы отслеживать отслеживание, если вы используете Gnat, вы не получаете никаких усилей производительности, просто пытаясь компилировать их отдельно, поскольку весь кузов пакета в конечном итоге заканчивается обработан, а использование «- это отдельно» Довольно редко в основном программировании ADA. Этот отвечать охватил некоторые из этого в предыдущем вопросе, который вы спросили.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top