Ada - 私人记录和私人阵列无法解决

时间:2014-10-09 19:39:10

标签: arrays private ada subtype

我有一个小包文件,我只想定义一对整数数组,但我想通过将类型设为私有来保护它。但是在编译和调试之后,我得到了一个无法解决的编译错误。

这是我的代码:

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 个答案:

答案 0 :(得分:5)

您不能拥有私有子类型。

要将某些内容声明为子类型,您必须指定它是子类型的基本类型。在隐藏基类型时,你不能暴露它是一个子类型的事实。

将其明确声明为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更好,但这是一个风格问题。)

正如Brian Drummond的评论所说:

  

第二个错误只是解析器无法理解第一个错误的错误结果......看到“私有”一词两次

这是您的软件包规范的修改版本,它只声明了一个私有记录类型。它编译没有错误。

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的数组,但我不确定你为什么隐藏在私人类型之后(坦白说,因为我已经足够长了)我真的使用了Ada,我不完全确定你如何使用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;