2014-10-09 86 views
0

我有一個小包文件,我只是想定義一個整數的幾個數組,但我想通過使類型爲私人來保護它。但編譯和調試後,我得到一個我無法解決的編譯錯誤。Ada - 私人記錄和私人陣列不工作

這裏是我的代碼:

package Objet_Packing is 

    type Objet_Type is private; 
    subtype Objet is private;  // This is line 9 

    type Tableau_Objet (<>) is private; 

private       // This is line 13 

    type Objet_Type is record 
     Largeur : Integer; 
     Hauteur : Integer; 
    end record; 

    subtype Objet is Objet_Type; 


    type Tableau_Objet is array (Integer range <>) of Objet; 

end Objet_Packing; 

這裏是我的錯誤:

gcc-4.6 -c test_objet_packing.adb 
objet_packing.ads:9:20: subtype indication expected 
objet_packing.ads:13:01: only one private part allowed per package 
gnatmake: "test_objet_packing.adb" compilation error 

所以我不明白,這兩個消息,以及一些幫助將是巨大的。

+1

第二個錯誤是解析器未能瞭解的第一個錯誤的只是一個虛假的後果......眼看着word「private」兩次。 – 2014-10-09 19:55:49

+0

@BrianDrummond:好點;我在我的回答中引用了你的評論。 – 2014-10-09 20:01:50

回答

4

您不能擁有私人子類型。

要將某些東西聲明爲子類型,必須指定它是其子類型的基類型。隱藏基類型時,您不能暴露它是子類型的事實。

要麼明顯聲明爲的Objet_Type亞型:

subtype Objet is Objet_Type; 

或聲明爲專用類型:

type Objet is private; 

在後一種情況下,可以將其定義爲在派生類型私人部分:

type Objet is new Objet_Type; 

這意味着您可能需要在某些情況下添加轉化地方。或者你可以把派生類型聲明放在可見部分。

另一方面,根本不知道爲什麼你需要兩個名字(Objet_TypeObjet)來表示基本相同的類型。你試圖做出什麼樣的區別?也許更好的選擇是完全刪除Objet的聲明,並直接使用Objet_Type本身。 (也許Objet會比Objet_Type一個更好的名字,但是這是一個風格問題。)

布賴恩德拉蒙德的評論說:

第二個錯誤是解析器未能理解第一的只是一個虛假的後果錯誤...看到單詞「私人」兩次

這是您的包規範的修改版本,只聲明一個單獨的私人記錄類型。它編譯沒有錯誤。

package Objet_Packing is 
    type Objet is private; 
    type Tableau_Objet (<>) is private; 
private 
    type Objet is record 
     Largeur : Integer; 
     Hauteur : Integer; 
    end record; 
    type Tableau_Objet is array (Integer range <>) of Objet; 
end Objet_Packing; 

雖然起名字Tableau_Objet意味着它是Objet數組反正我「米不知道爲什麼你隱藏了背後的私人型(坦白地說它已經足夠長的時間,因爲我已經真正使用阿達我不是很確定你會如何使用類型Tableau_Objet)更透明的另類:

package Objet_Packing is 
    type Objet is private; 
    type Tableau_Objet is array (Integer range <>) of Objet; 
private 
    type Objet is record 
     Largeur : Integer; 
     Hauteur : Integer; 
    end record; 
end Objet_Packing; 
+0

「另一方面,你完全不清楚爲什麼你需要兩個名字(Objet_Type和Objet),它們是基本相同的類型。你想要做什麼區別?」 - @凱特湯普森 我必須使用兩個名字,因爲數組只需要子類型。但是,當涉及私人資料時,它似乎不能正常工作。 – cycourtot 2014-10-11 15:52:33

+0

@cycourtot:「*因爲數組只需要子類型*」 - 我不認爲這是真的。嘗試更改數組以聲明使用記錄類型而不是子類型。 – 2014-10-11 17:01:37

+0

@Kieth Thompson這是我嘗試的第一件事,但我得到編譯錯誤。但它也可能與私人的無意義有關。 – cycourtot 2014-10-12 20:50:16