1

宣言部分、関数、およびパッケージを含むクエリがあります。次に示すようなパッケージがあります。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 の計算で通常の引数として使用することができます。しかし、Compute_Jacobian パッケージの X1 の計算を使用して、上記の構造 (上記の投稿はこちら) が必要でした。

どうもありがとう...

4

1 に答える 1

2

まあ、コンパイラは問題が何であるかを正確に伝えています:-)

宣言のみを許可するコードの領域で代入ステートメントを実行しようとしています。

少なくとも、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;

これは、探しているものを取得するための 1 つのアプローチです。

または、X1 が Compute_J21 内でのみ使用される場合は、その関数内で実行される最初のステートメントの 1 つとして (または X1 宣言の初期化として) Compute_X1 を呼び出す必要があります (そして、X1 の代わりに Force_Applied を引数として 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;

そして、「分離されている」の使用に関する注意事項が 1 つあります...複雑さのために、これらの関数の実装を別々に設定したいという衝動は理解していますが、それでもそうしないことをお勧めします。追跡する別のファイルを追加するだけです.GNATを使用している場合、パッケージ本体全体が最終的に処理されるため、個別にコンパイルしようとしてもパフォーマンスが向上しません。主流の Ada プログラミングでは非常にまれです。この回答は、あなたが尋ねた以前の質問でこれの一部をカバーしています。

于 2010-09-23T13:21:03.337 に答える