2014-10-09 55 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