我是Ada的新手并且遇到了一些问题。我创建了一个通用的Date包:
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 RANGE 1..31;
Year: Integer;
END RECORD;
PROCEDURE PrintDate(Adate: IN DateRec);
END Date;
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
答案 0 :(得分:0)
您的Date
软件包没有通用参数,因此可能没有必要使它成为通用的。
如果您删除GENERIC
关键字,它可能会有效(我自己实际上没有尝试过)。
如果你真的希望它是通用的,那么你需要实例化它才能使用它。 Date
不是一个包;这是一个通用包。
generic
package Date is
...
end Date;
package MyDate is new Date;
现在MyDate
是一个(非通用)包,您可以参考MyDate.DateRec
。
通过使其成为通用的,没有通用参数,您可以创建多个实例化,每个实例化都是一个不同的包,因此MyDate.DateRec
和YourDate.DateRec
是不同的类型。目前尚不清楚这是值得的。
通常,通用包具有一个或多个参数,因此不同的实例可以在不同的类型上运行。您甚至在代码中都有这样的示例:Ada.Text_IO.Enumeration_IO
是通用的,而您的MonthNameIO
是该通用包的特定实例。