Ada:从另一个包中浮动实例化

时间:2010-07-19 20:02:47

标签: floating-point instantiation ada

我正在尝试创建一个具有6位精度的新Float类型。但似乎我无法使用它。这是MyFloat_IO.ads包中的代码

WITH Ada.Text_IO;

PACKAGE MyFloat_IO IS

TYPE MyFloat IS DIGITS 6 RANGE 0.0..Float'Last;
PACKAGE MyFloat_IO IS NEW Ada.Text_IO.Float_IO(MyFloat);

end MyFloat_IO;

和主要代码:

WITH Ada.Text_IO;
WITH MyFloat_IO;
USE MyFloat_IO;
WITH Ada.Numerics;


PROCEDURE TEST2 IS

X : MyFloat := 3.5;
Y : CONSTANT := Ada.Numerics.Pi;
Z : MyFloat;


BEGIN -- main program
  Z := X * Y;
  MyFloat_IO.Put(Z);
  Ada.Text_IO.New_Line;
END TEST2;

在编译时,我收到错误消息:

14. BEGIN -- main program
15.     Z := X * Y;
16.     MyFloat_IO.Put(Z);
                  |
    >>> "Put" not declared in "MyFloat_IO"

17.     Ada.Text_IO.New_Line;
18. END TEST2;

我做错了什么?

非常感谢...


根据T.E.D的建议更新:新代码:

  1. 包MyFloat_I0.ads:

    WITH Ada.Text_IO;
    PACKAGE MyFloat_I0 IS
    TYPE Instance IS DIGITS 6 RANGE 0.0..Float'Last;
    PACKAGE MyFloat IS NEW Ada.Text_IO.Float_IO(Instance);
    end MyFloat_I0;
    
  2. 和主要代码:

    WITH Ada.Text_IO;
    WITH MyFloat_I0;
    use MyFloat_I0;
    WITH Ada.Numerics;
    
    PROCEDURE TEST2 IS
    
    
    X : Instance := 3.5;
    Y : CONSTANT := Ada.Numerics.Pi;
    Z : Instance;
    
    
    BEGIN -- main program
      Z := X * Y;
      MyFloat.Instance.Put(Z);
      Ada.Text_IO.New_Line;
    END TEST2;
    
  3. 编译时我得到:

    MyFloat.Instance.Put(Z);
                   |
        >>> "Instance" not declared in "MyFloat"
    

1 个答案:

答案 0 :(得分:2)

你做错了是你在另一个名为MyFloat_IO的软件包中声明了一个名为MyFloat_IO的软件包(派生自Ada.Text_IO.Float_IO) 。为了获得宣告事物的方式,您必须致电:

MyFloat_IO.MyFloat_IO.Put(Z);

我很确定可以从一个泛型派生出一个包作为编译单元。但是,您可以考虑重命名包MyFloat,类型为Instance,以及您的IO包IO。这样,想要使用它的人会对类型说MyFloat.Instance,对IO包说MyFloat.IO

(更新答案)

我可以从你发布的代码中看到我一定很困惑你。这就是我的想法(警告:未编译)。

package MyFloat is
   type Instance is digits 6 range 0.0..Float'Last; --'

   package IO is new Ada.Text_IO.Float_IO (Instance);
end MyFloat;

换句话说,包名为MyFloat,类型名为Instance,IO包名为IO。从包外部调用时,类型为MyFloat.Instance,put例程为MyFloat.IO.Put

请注意,如果您使用的是Gnat,则在重命名包时必须重命名源文件。