如何从通用包实例化记录

时间:2014-02-17 18:56:34

标签: ada

我是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             

1 个答案:

答案 0 :(得分:0)

您的Date软件包没有通用参数,因此可能没有必要使它成为通用的。

如果您删除GENERIC关键字,它可能会有效(我自己实际上没有尝试过)。

如果你真的希望它是通用的,那么你需要实例化它才能使用它。 Date不是一个包;这是一个通用包。

 generic
 package Date is
 ...
 end Date;

 package MyDate is new Date;

现在MyDate是一个(非通用)包,您可以参考MyDate.DateRec

通过使其成为通用的,没有通用参数,您可以创建多个实例化,每个实例化都是一个不同的包,因此MyDate.DateRecYourDate.DateRec是不同的类型。目前尚不清楚这是值得的。

通常,通用包具有一个或多个参数,因此不同的实例可以在不同的类型上运行。您甚至在代码中都有这样的示例:Ada.Text_IO.Enumeration_IO是通用的,而您的MonthNameIO是该通用包的特定实例。