Ада: плавающий экземпляр из другого пакета - PullRequest
1 голос
/ 20 июля 2010

Я пытаюсь создать новый тип Float с точностью до 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"

1 Ответ

2 голосов
/ 20 июля 2010

Что вы делаете неправильно, так это то, что вы объявили пакет с именем MyFloat_IO (производный от Ada.Text_IO.Float_IO) внутри другого пакета, который также называется MyFloat_IO.Чтобы добиться того, как вы объявляете вещи, вам нужно было бы позвонить:

MyFloat_IO.MyFloat_IO.Put(Z);

Я уверен, что можно просто извлечь пакет из универсального объекта как единицу компиляции.,Однако вы можете вместо этого переименовать пакет MyFloat, тип что-то вроде Instance и ваш пакет ввода-вывода IO.Таким образом, люди, желающие его использовать, скажут MyFloat.Instance для типа и 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, а пакет ввода-вывода - * 1020.*.При вызове извне пакета типом является MyFloat.Instance, а процедура put - MyFloat.IO.Put.

Обратите внимание, что если вы используете Gnat, вам придется переименовывать исходный файл при переименовании пакета.

...