1

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;

私は何が間違っているのですか?

どうもありがとう...


更新: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);

コンパイル単位として、ジェネリックからパッケージを派生させることは可能だと確信しています。ただし、代わりに、パッケージの名前、MyFloatタイプのようなものInstance、およびIOパッケージの名前を変更することを検討してください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 に答える