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

1 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;
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

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
Run Code Online (Sandbox Code Playgroud)

所以我不明白这两个消息,一些帮助会很棒.

Kei*_*son 5

您不能拥有私有子类型.

要将某些东西声明为子类型,您必须指定它是其子类型的基本类型.在隐藏基类型时,您不能暴露它是子类型的事实.

要么将它明确地声明为以下子类型Objet_Type:

subtype Objet is Objet_Type;
Run Code Online (Sandbox Code Playgroud)

或将其声明为私人类型:

type Objet is private;
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,您可以将其定义为私有部分中的派生类型:

type Objet is new Objet_Type;
Run Code Online (Sandbox Code Playgroud)

这意味着您可能需要在某些地方添加转化.或者您可以将派生类型声明放在可见部分中.

另一方面,为什么你需要两个名称(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;
Run Code Online (Sandbox Code Playgroud)

虽然这个名字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;
Run Code Online (Sandbox Code Playgroud)