2013-05-03 5 views
5

通常のスペックとボディファイルを持つメインパッケージがあります。私は親の子パッケージを作成しようとしていますが、それらを別々のコンパイルファイルに入れたいのです。パッケージ本体であれば、あるいはサブプログラム/ proc/funcであれば、簡単に実行できます。しかし、私は子の仕様ファイルを作ることができません。Adaで別のコンパイル単位として子パッケージを持つことが可能です

私がこれをやっている理由は、同じ親の他の子供が利用できる子供の情報を持っているからです。私は親にspec部分を含めるだけでこれを行うことができますが、それは私の親ファイルをかなり大きくしています。

これも可能ですか、別のルートユニットを作る以外に選択肢はありませんか?または、すべてのスペックを親に賢く残しておきますか?親で

は、私が試した はpackage Child1 is separate;(もParent.Child1を試してみましたが、それはエラー

子で

コンパイルしました:

separate(Parent) 

package Parent.Child1 is 
.... 
end Parent.Child1; 

アイデアだけではない可能性

更新:私はGreen Hills Multi Compilerでコンパイルしています。Ada95言語版、非OOプロジェクト

+0

"is separate"は、巨大なサブルーチンを独自のソースファイルに移動するためのものです。パッケージのためにnessecaryではありません。ルーチンの場合は、代わりにルーチンを単純化するのが普通です。私が取り組んだプロジェクトの多くは、実際にその使用を禁止しています。ユーザーとしては、それが何をしているのかを学ぶことをお勧めします。そうすれば、それを使用するコードを読むことができますが、自分では使用しないでください。 –

+0

巨大なファイルで終わらないのですか?私はモンスターサイズのファイルを持つことを避けようとしています。すべてのコードを.adsと.adbに入れると、コメントは約6000行になります。 – Awaken

+0

ファイルが巨大な場合は、パッケージが複数のパッケージに分割されている必要があります(それぞれが独自のファイルを取得し、膨大なファイルの問題も解決します)。同様に、1つのルーチンが巨大である場合、ほとんどの場合、複数のルーチン(または極端な場合はパッケージ全体)に分割する必要があります。 –

答えて

5

はい、これはまったく問題ありません。

parent.ads

package Parent is 
-- ... 
end Parent; 

parent-child.ads

package Parent.Child is 
-- ... 
end Parent.Child; 

parent-other.ads:あなたは別々のファイルにあなたの親と子パッケージを持つことができます。

limited with Parent.Child; --Need Ada 2005 
package Parent.Other is 
-- ... 
end Parent.Other; 

parent.childパッケージとparent.otherパッケージは、parentの定義にアクセスできます(いくつかの制限があります)。それはparent.childの定義にアクセスできるようにする方法parent.otherwith S」parent.child

注意してください。

私はそれができる方法のexampleを持っています。また、ここにはexample from wikibooksがあります。

+1

あなたの '限定with'の例は、意図に応じて私的な子パッケージを使う方が良いかもしれません。 'private package Parent.Child'では、' Parent.Child'は子どもの体と他の私的な子供のスペックによって見ることができます。この機能はAda95にありました。 –

+0

申し訳ございません。私がそれをやろうとしたとき、仕様とボディを同じファイルに入れればうまく動作します。私がspecファイルを.adsファイルに、bodyを.adbファイルに入れると、対応するSpecが見つかりませんでした。 (私も元の質問にいくつかの詳細を追加しました) – Awaken

+0

また、親の親子からプロシージャにアクセスしようとしましたが、直接名子が表示されないことを示しています。 親に子供がいることを伝えるものが必要ですか? – Awaken

5

キーワードseparateを使用していることに注目して、あなたの質問は子の単位ではなくネストされた単位であることを念頭に置いています。

次のことを試してみてください。

Testing.adb

With 
Ada.Text_IO, 
Parent; 

Procedure Testing is 
Begin 
    Ada.Text_IO.Put_Line("Starting Test:"); 

    Parent.Nested.Test_Procedure; 

    Ada.Text_IO.Put_Line("Testing complete."); 
End Test; 

Parent.ads

Package Parent is 

    Package Nested is 
     Procedure Test_Procedure; 
    End Nested; 

End Parent; 

Parent.adb

Package Body Parent is 

    Package Body Nested is separate; 

End Parent; 

Parent-Nested.adb

(注:あなたは、私が「ドット交換」のデフォルト設定でGNATを使用しているファイル名のためにわずかに異なるものを使用する必要があります)

with Ada.Text_IO; 

separate (Parent) 

package body Nested is 

    Procedure Test_Procedure is 
    Message : Constant string:= ASCII.HT & 
     "Hello from the separate, nested test-procedure."; 
    begin 
     Ada.Text_IO.Put_Line(Message); 
    end Test_Procedure; 

End Nested; 

あなたはコンパイルすることができるはずですし、次のように出力が三行する必要があります:

  1. Starting Test:
  2. Hello from the separate, nested test-procedure.
  3. Testing complete.

ここでの問題は、ネストされたと子パッケージ間の差異に関する若干の誤解から生じています。両方とも、ドット区切り付きの同じ方法でアクセスされます。ParentNestedおよびParentChild

微妙な違いは、子パッケージは常に別々にコンパイルされたユニットであるということです(GNATでは、それらは常に別のファイルにあります。これはライブラリの実装方法による実装制限ですが、 Adaコンパイラは異なるcompilation_unitを同じファイルに置くことができます)。しかし、ネストされたパッケージは、具体的にseparateとタグ付けされていない限り、その包含単位がコンパイルされると同時にコンパイルされなければなりません。


現在の入れ子構造を維持し、まだ使用するためには、あなたがパッケージのすべての仕様を保持する単一の補助パッケージに次のメソッドを使用することができます分けます。

Parent.ads

Package Parent is 

    -- Here's the magic of renaming. --' 
    Package Nested renames Auxiliary.Delegate; 

End Parent; 

Auxiliary.ads

Package Auxiliary is 

    Package Delegate is 
     Procedure Test_Procedure; 
    End Delegate; 

End Auxiliary; 

Auxiliary.adb

package body Auxiliary is 

    Package Body Delegate is separate; 

end Auxiliary; 

Auxiliary-Delegate.adb

(注意:あなたは、ファイル名のためにわずかに異なるものを使用する必要があり、私は「ドット交換」のデフォルト設定でGNATを使用しています)

with Ada.Text_IO; 

separate (Auxiliary) 

package body Delegate is 

    Procedure Test_Procedure is 
    Message : Constant string:= ASCII.HT & 
     "Hello from the separate, nested test-procedure."; 
    begin 
     Ada.Text_IO.Put_Line(Message); 
    end Test_Procedure; 

End Delegate; 
+0

あなたは正しいことが、私がやろうとしていることのようなものです。問題は、いくつかの "入れ子になった"パッケージがあることです。そして、これらの「パッケージ入れ子です」部分には、1つの手順だけが含まれているわけではありません。それには多くの手続きが含まれていますが、もっと重要なのはそれにはたくさんのレコードタイプが含まれていることです。だから、あなたが4つまたは5つを持っている場合、私は体を別にしてもネストされたパッケージを宣言するだけで、500行以上のコードが完成します。 私は実際にあなたが上に示したことを正確に行い、うまく働いています。私はちょうどメインファイル内の宣言の巨大な領域が気に入らず、それを移動したいと思います。 – Awaken

+0

ああ、私はあなたがそれを行う方法を知っています...私は教会に向かおうとしていますが、私はそれを書いて後で私の答えを編集することができます。 – Shark8

+0

あなたは、仕様を隠して、 'separate'を(そして' with'/'use'節を溺れさせずに)ボディを持つ方法があります。 – Shark8

関連する問題