Ну, компилятор точно говорит вам, в чем проблема: -)
Вы пытаетесь выполнить оператор присваивания в области кода, которая допускает только объявлений .
По крайней мере, я не вижу вашего объявления 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. Этот ответ покрывал часть этого в предыдущем вопросе, который вы задали.