通用记录的定义

时间:2012-11-18 14:42:49

标签: generics types record ada

我对通用记录的定义有些麻烦:

-- ADS File
package Stack is

    -- (generic) Entry
    generic type StackEntry is private;

    -- An array of Entries (limited to 5 for testing)
    type StackEntryHolder is array (0..5) of StackEntry;

    -- Stack type containing the entries, it's max. size and the current position
    type StatStack is
    record                                  -- 1 --
        maxSize : Integer := 5;             -- max size (see above)
        pos : Integer := 0;                 -- current position
        content : StackEntryHolder;         -- content entries
    end record;


    -- functions / procedures

end Stack;

如果我编译这个我得到以下错误(在-- 1 --):

  

通用类型定义中不允许记录

3 个答案:

答案 0 :(得分:4)

我认为你想制作一个通用的,它提供私有类型的StatStack及其操作。

答案 1 :(得分:3)

我认为你正在寻找更像这样的东西:

generic 
   type StackEntry is private;
package Stack_G is

   type ReturnCode is (Ok,Stack_Full,Stack_Empty);

   -- functions / procedures
   procedure Push (E  : in     StackEntry;
               RC :    out ReturnCode);
   procedure Pop (E  : out StackEntry;
              RC : out ReturnCode);
private
   -- An array of Entries (limited to 5 for testing)
   type StackIndex is new Integer range 1 .. 5;
   type StackEntryHolder is array (StackIndex) of StackEntry;

   -- Stack type containing the entries, it's max. size and the current position
   type StatStack is record 
      IsEmpty : Boolean := True;
      Pos : StackIndex := StackIndex'First;-- current position
      Content : StackEntryHolder;          -- content entries
   end record;

end Stack_G;
  1. 您不需要maxSize,您可以从数组属性中获取 '长度或堆栈索引类型'弹。
  2. 我已将堆栈重命名为stack_g(我的命名约定表示 它是一个通用包)
  3. StackEntry是泛型的参数,您需要我们 在实例化堆栈包时。
  4. 我添加了一个堆栈索引类型,在实践中习惯了 在Ada中使用新类型和子类型,可以节省您数小时的时间 后面。

答案 2 :(得分:3)

那是因为您编写的代码不遵循通用声明的正确语法。您可以在the LRM中以光荣的BNF形式查看此内容。

基本上,您必须决定是否要声明通用包通用例程。猜测你想要更多只有一个子程序通用,我假设你想要一个包。鉴于它应该看起来像:

generic {generic formal stuff} {package declaration}

...其中“{package declaration}”只是一个正常的包退出(但可以使用在通用正式部分中声明的东西),而“{generic formal stuff}”是一系列通用的“decrations”客户将传递给通用的正式“参数。

您的代码中发生的事情是编译器看到了神奇的单词generic,并且现在期待所有内容,直到下一个子程序或包退出将是通用的形式参数。它找到的第一个,在同一行上的私有类型退出,就好了。但是,下一行包含一个完整的记录声明,它看起来根本不像一个通用的形式参数。所以编译器感到困惑并吐出错误。