Ada 如何从泛型包实例化记录
我是Ada的新手,有一些问题。我创建了一个通用日期包: Date.ads:Ada 如何从泛型包实例化记录,ada,Ada,我是Ada的新手,有一些问题。我创建了一个通用日期包: Date.ads: GENERIC PACKAGE Date IS TYPE MonthName IS (January, February, March, April, May, June, July, August, September, October, November, December); TYPE DateRec IS RECORD Month: MonthName; Day: Integer
GENERIC
PACKAGE Date IS
TYPE MonthName IS (January, February, March, April, May, June, July, August,
September, October, November, December);
TYPE DateRec IS RECORD
Month: MonthName;
Day: Integer RANGE 1..31;
Year: Integer;
END RECORD;
PROCEDURE PrintDate(Adate: IN DateRec);
END Date;
日期:adb:
WITH Ada.Text_IO;
USE Ada.Text_IO;
PACKAGE BODY Date IS
PACKAGE MonthNameIO IS NEW Ada.Text_IO.Enumeration_IO(MonthName);
USE MonthNameIO;
PACKAGE IntegerIO IS NEW Ada.Text_IO.Enumeration_IO(Integer);
USE IntegerIO;
PROCEDURE PrintDate(Adate: IN DateRec) IS
BEGIN
Put(Adate.Month);
Put(Adate.Day,3);
Put(",");
Put(Adate.Year, 5);
New_Line;
END PrintDate;
END Date;
我希望能够在程序中使用“DateRec”,但在尝试编译时会遇到错误。呼叫代码:
WITH Date;
...
PACKAGE Date_Stack IS NEW Gstack(StackSize, DateRec);
我在编译时遇到以下错误:
genstack.adb:176:57: "DateRec" is not visible (more references follow)
genstack.adb:176:57: non-visible declaration at date.ads:7
我错过了什么
好的,现在我遇到的问题是当我尝试使用一个对象时:
TempDate: Date.DateRec;
...
Get(TempDate.Month);
现在,编译给了我:
genstack.adb:201:25: missing argument for parameter "Item" in call to "Get" declared at a-tienio.ads:65, instance at line 183
您的
Date
包没有通用参数,因此可能没有必要将其设置为通用参数
如果您删除GENERIC
关键字,它可能会起作用(我自己还没有尝试过)
如果您确实希望它是泛型的,那么您需要在使用它之前实例化它<代码>日期不是一个包;这是一个通用的软件包
generic
package Date is
...
end Date;
package MyDate is new Date;
现在MyDate
是一个(非通用)包,您可以参考MyDate.DateRec
通过使其不带泛型参数,可以创建多个实例化,每个实例化都是一个不同的包,因此MyDate.DateRec
和YourDate.DateRec
是不同的类型。不清楚这是否值得
通常,泛型包有一个或多个参数,因此不同的实例在不同的类型上运行。你的代码中甚至有这样的例子:
Ada.Text\u IO.Enumeration\u IO
是泛型的,你的MonthNameIO
是泛型包的一个具体实例。语言是“Ada”,而不是“Ada”(它是一个名称,不是首字母缩写)。你在Date.adb
中的缩进是关闭的;从<代码>包装月…到<代码>程序打印日期的所有内容都应再缩进一级。另外,Ada代码的现代惯例是用小写字母而不是大写字母(这是Ada参考手册中使用的惯例)。关于编辑:你应该问一个新问题。事实上,我怀疑在错误发生的地方没有类似的MonthNameIO
;您已经在日期主体中完成了实例化。也许你可以把它移到规范的可见部分。正如@SimonWright所说,这是一个新问题,与原来的问题无关。第183行是否指您的MonthNameIO
?调用Get(TempDate.Month)代码>看起来正确。如果你需要帮助,把你的代码缩小到一个简单的例子来演示这个问题(不是原来的问题),然后在一个新的问题中发布它MonthNameIO.Get
仅在Date
主体内可见,而不在其外部可见,因为它是在Date
主体中声明的。产生令人困惑的错误消息的原因可能是存在其他可见的Get
[s],可能来自Enumeration\u IO
的另一个实例,并且编译器正试图使您的调用符合其他Get
[s]的声明。谢谢,这解决了我的第一个问题。现在,我有了一个处理Get()的新函数。我已经用更多的细节更新了原来的帖子。
generic
package Date is
...
end Date;
package MyDate is new Date;