1

我正在尝试创建一个具有 6 位精度的新浮点类型。但似乎我无法使用它。这是 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;

我究竟做错了什么?

非常感谢...


更新:根据 TED 的建议的新代码:

  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;
    

在编译时我得到:

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

1 回答 1

2

你做错了什么是你另一个名为 MyFloat_IO 的包中声明了一个名为 MyFloat_IO 的包(派生自 Ada.Text_IO.Float_IO)。为了以您声明事物的方式进行处理,您必须调用:

MyFloat_IO.MyFloat_IO.Put(Z);

我很确定可以从泛型本身作为编译单元派生一个包。但是,您可能会考虑重命名 package MyFloat、类似的类型Instance以及您的 IO package IO。这样,希望使用它MyFloat.Instance的人会说类型和MyFloat.IOIO 包。

(更新答案)

从您发布的代码中可以看出,我一定把您彻底搞糊涂了。这是我的想法(警告:未编译)。

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,则在重命名包时必须重命名源文件。

于 2010-07-19T22:11:46.770 回答