我对通用记录的定义有些麻烦:
-- 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 --
):
通用类型定义中不允许记录
答案 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;
答案 2 :(得分:3)
那是因为您编写的代码不遵循通用声明的正确语法。您可以在the LRM中以光荣的BNF形式查看此内容。
基本上,您必须决定是否要声明通用包或通用例程。猜测你想要更多只有一个子程序通用,我假设你想要一个包。鉴于它应该看起来像:
generic
{generic formal stuff} {package declaration}
...其中“{package declaration}”只是一个正常的包退出(但可以使用在通用正式部分中声明的东西),而“{generic formal stuff}”是一系列通用的“decrations”客户将传递给通用的正式“参数。
您的代码中发生的事情是编译器看到了神奇的单词generic
,并且现在期待所有内容,直到下一个子程序或包退出将是通用的形式参数。它找到的第一个,在同一行上的私有类型退出,就好了。但是,下一行包含一个完整的记录声明,它看起来根本不像一个通用的形式参数。所以编译器感到困惑并吐出错误。