2013-05-03 52 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

「是分離的」實際上意味着將巨大的子程序移動到它們自己的源文件中。這對包裝來說並不是必需的。對於例程來說,它通常是一個更好的主意,而不是簡化例程。我所從事的許多項目實際上都禁止使用它。作爲用戶,我建議你學習它的功能,以便你可以閱讀使用它的代碼,但是不要自己使用它。 – 2013-05-03 18:29:08

+0

難道你最終沒有大文件?我試圖避免有一個怪物大小的文件。如果我把所有的代碼放在.ads和.adb中,它大約有6000條評論。 – Awaken 2013-05-05 11:36:48

+0

如果文件很大,你的軟件包幾乎肯定需要分解成多個軟件包(每個軟件包都有自己的文件,解決了大文件問題)。同樣,如果一個例程很龐大,幾乎肯定需要分解成多個例程(甚至在極端情況下甚至是整個軟件包)。 – 2013-05-05 13:30:12

回答

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.otherwith的」 parent.child,使其有權訪問parent.child的定義。

我有一個example它是如何做到的。此外,這是一個example from wikibooks

+1

根據意圖,使用私人兒童套餐可能會更好地完成「受限制」示例。在'私人包裝Parent.Child'中,'Parent.Child'可以被任何孩子的身體和其他私人孩子的規格看到。此功能在Ada95中。 – 2013-05-03 05:38:26

+0

好的。當我試圖做到這一點,如果我把規格和正文放在同一個文件中,它可以正常工作。當我試圖將.ads文件和body放在.adb文件中時,它說它找不到相應的Spec。 (我也在我原來的問題中添加了一些更多的細節) – Awaken 2013-05-03 11:11:04

+0

另外,我嘗試訪問從父母在父母的過程,它告訴我直接名稱子不可見。 父母是否需要一些告訴家長有小孩的東西? – Awaken 2013-05-03 11:20:05

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.

這裏的問題就從嵌套和子包之間的差異有輕微的誤解造成的。兩者都使用相同的點分隔限定方法訪問:ParentNestedParentChild

細微的區別在於,子包總是一個單獨編譯的單元(在GNAT中它們總是在不同的文件中,這是由於它們[不]實現庫的實現限制..但一些Ada編譯器可以將不同的compilation_units放入同一個文件中),但是嵌套包必須在編譯時纔會編譯它的封裝單元,除非它被專門標記爲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個時,即使我把它們分開,你最終也只需要聲明嵌套包。 我實際上做了你上面顯示的內容,並使其工作得很好。我只是不喜歡主文件中的大量聲明,並且想將其移出。 – Awaken 2013-05-05 11:34:30

+0

哦,我知道你可以這樣做的方式......我即將前往教堂,但我可以寫下來,稍後編輯我的答案。 – Shark8 2013-05-05 13:58:00

+0

這裏有一種方法可以隱藏規範,並讓主體「分開」(並且不會用''/''use'子句淹沒你的'''')。 – Shark8 2013-05-05 20:16:22

相關問題