Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Ada-私有记录和私有数组不工作_Arrays_Private_Ada_Subtype - Fatal编程技术网

Arrays Ada-私有记录和私有数组不工作

Arrays Ada-私有记录和私有数组不工作,arrays,private,ada,subtype,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

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

这是我的密码:

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;

所以我不理解这两条消息,一些帮助会很好。

您不能有私有子类型

要将某个对象声明为子类型,必须指定其子类型的基类型。隐藏基类型时,不能暴露它是子类型的事实

将其以可见方式声明为Objet_类型的子类型:

或将其声明为私有类型:

type Objet is private;
在后一种情况下,可以在专用部分中将其定义为派生类型:

type Objet is new Objet_Type;
这意味着您可能需要在某些地方添加转换。也可以将派生类型声明放在可见部分中


另一方面,根本不清楚为什么需要两个名称Objet_Type和Objet来表示本质上相同的类型。你想做出什么区别?也许更好的选择是完全删除Objet的声明,直接使用Objet_类型本身。也许Objet是一个比Objet_类型更好的名称,但这是一个风格问题

正如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;

不能有私有子类型

要将某个对象声明为子类型,必须指定其子类型的基类型。隐藏基类型时,不能暴露它是子类型的事实

将其以可见方式声明为Objet_类型的子类型:

或将其声明为私有类型:

type Objet is private;
在后一种情况下,可以在专用部分中将其定义为派生类型:

type Objet is new Objet_Type;
这意味着您可能需要在某些地方添加转换。也可以将派生类型声明放在可见部分中


另一方面,根本不清楚为什么需要两个名称Objet_Type和Objet来表示本质上相同的类型。你想做出什么区别?也许更好的选择是完全删除Objet的声明,直接使用Objet_类型本身。也许Objet是一个比Objet_类型更好的名称,但这是一个风格问题

正如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;

第二个错误只是解析器未能理解第一个错误的虚假结果。。。“私人”这个词看了两遍。@BrianDrummond:说得好;我在回答中引用了你的评论。第二个错误只是解析器未能理解第一个错误的虚假结果。。。“私人”这个词看了两遍。@BrianDrummond:说得好;我在回答中引用了你的评论。另一方面,你根本不清楚为什么需要两个名称Objet_Type和Objet来表示本质上相同的类型。你想做出什么区别@Keith Thompson我必须使用两个名称,因为数组只需要子类型。但是当涉及到私有内容时,它似乎不能正常工作。@cycourtot:因为数组只需要子类型——我不认为这是真的。尝试将声明数组更改为使用记录类型而不是子类型。@Kieth Thompson这是我第一次尝试,但我遇到了编译错误。但它也可能与私人的无意义有关。另一方面,对于本质上相同的类型,为什么需要两个名称Objet_Type和Objet,我们一点也不清楚。你想做出什么区别@Keith Thompson我必须使用两个名称,因为数组只需要子类型。但是当涉及到私有内容时,它似乎不能正常工作。@cycourtot:因为数组只需要子类型——我不认为这是真的。尝试将声明数组更改为使用记录类型而不是子类型。@Kieth Thompson这是我第一次尝试,但我遇到了编译错误。但这也可能与私人的无意识有关。