我正在尝试创建一个具有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的建议更新:新代码:
包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;
和主要代码:
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"
答案 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,则在重命名包时必须重命名源文件。