Ада: декларативная часть, функция и пакеты - PullRequest
1 голос
/ 23 сентября 2010

У меня есть запрос с декларативной частью, функцией и пакетами. У меня есть пакет, как показано ниже. Из-за сложности функции 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.

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

1 Ответ

2 голосов
/ 23 сентября 2010

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

Вы пытаетесь выполнить оператор присваивания в области кода, которая допускает только объявлений .

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

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

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 (и переменные, передаваемые в качестве аргументов), а затем вызвать ваши функции Compute, например, (предупреждение, не скомпилировано)

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 используется исключительно в Compute_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, вы не получаете никакого выигрыша в производительности, просто пытаясь скомпилировать их отдельно, так как все тело пакета в конечном итоге обрабатывается, и использование «is отдельное» теперь довольно необычно в основном программировании Ada. Этот ответ покрывал часть этого в предыдущем вопросе, который вы задали.

...