Ада: как получить доступ к этой переменной? - PullRequest
4 голосов
/ 11 июля 2010

У меня есть пример измененного учебника (книга «Понимание Ады» - подход Брея и Покрасса к разработке программного обеспечения):

PACKAGE SOLAR_SYSTEM IS

 TYPE PLANET IS (MERCURY, VENUS, MARS, JUPITER, SATURN, NEPTUNE);

 SUBTYPE TERRESTRIAL_PLANET IS PLANET RANGE MERCURY..MARS;
 SUBTYPE JOVIAN_PLANET IS PLANET RANGE JUPITER..NEPTUNE;

 TYPE MILES IS DIGITS 5 RANGE 0.0..5.0E9;
 TYPE PLANET_FACTS IS ARRAY (PLANET) OF MILES;

 DISTANCE_TO_SUN : CONSTANT PLANET_FACTS :=
  (MERCURY => 36.0E6, VENUS => 67.2E6, MARS => 141.7E6,
  JUPITER => 484.0E6, SATURN => 887.0E6, NEPTUNE => 2797.0E6);

 NUMBER_OF_MOONS: CONSTANT ARRAY (PLANET) OF NATURAL :=
  (MERCURY => 0, VENUS => 0, MARS => 2,
  JUPITER => 12, SATURN => 10, NEPTUNE => 2);

END SOLAR_SYSTEM;

Теперь для доступа к некоторым переменным и их содержимому,

WITH Ada.Float_Text_IO;
WITH Ada.Text_IO;
WITH Ada.Integer_Text_IO;
WITH SOLAR_SYSTEM;
USE SOLAR_SYSTEM;


PROCEDURE TEST2 IS

BEGIN -- main program
  Ada.Integer_Text_IO.Put(Item => NUMBER_OF_MOONS(Saturn));
  Ada.Text_IO.New_Line;
  Ada.Float_Text_IO.Put(Item => DISTANCE_TO_SUN(Saturn));
END TEST2;

Я могу получить доступ к NUMBER_OF_MOONS (Сатурн) без каких-либо проблем, но у меня есть трудности с доступом к DISTANCE_TO_SUN (Сатурн).Как получить к нему доступ?

спасибо большое ...

Это то, что я получаю при компиляции с утверждением

Ada.Float_Text_IO.Put(Item => DISTANCE_TO_SUN(Saturn));

файл списка:

1. WITH Ada.Float_Text_IO;
            |
    >>> warning: no entities of "FLOAT_TEXT_IO" are referenced

 2. WITH Ada.Text_IO;
 3. WITH Ada.Integer_Text_IO;
 4. WITH SOLAR_SYSTEM;
 5. USE SOLAR_SYSTEM;
 6.
 7.
 8. PROCEDURE TEST2 IS
 9.
10.    BEGIN -- main program
11.     Ada.Integer_Text_IO.Put(Item => NUMBER_OF_MOONS(Saturn));
12.     Ada.Text_IO.New_Line;
13.     Ada.Float_Text_IO.Put(Item => DISTANCE_TO_SUN(Saturn));
                         1            5
    >>> no candidate interpretations match the actuals:
    >>> missing argument for parameter "To" in call to "PUT" declared at a-tiflio.ads:81, instance at a-flteio.ads:20
    >>> missing argument for parameter "File" in call to "PUT" declared at a-tiflio.ads:63, instance at a-flteio.ads:20
    >>> possible missing instantiation of Text_IO.Float_IO
    >>> expected type "Standard.Float"
    >>> found type "MILES" defined at solar_system.ads:8
    >>>   ==> in call to "Put" at a-tiflio.ads:70, instance at a-flteio.ads:20

14.    END TEST2;

Проблема в том, что DISTANCE_TO_SUN (Saturn) имеет тип MILES, который является одним из типов с плавающей запятой.Так что просто использование Ada.Float_Text_IO.Put не сработает.

1 Ответ

4 голосов
/ 12 июля 2010

Проблема в том, что вы объявили совершенно новый тип MILES, который является «подобным float», но не предопределенным типом float. Поэтому, когда вы пытаетесь положить элемент этого типа, то есть DISTANCE_TO_SUN (Сатурн), для этого типа нет процедуры Put.

У вас есть три основных варианта:

1) Создание экземпляра Float_Text_IO с типом миль:

 package Miles_IO is new Ada.Text_IO.Float_IO(Solar_System.Miles);

, а затем используйте Miles_IO для вывода значения:

 Miles_IO.Put(DISTANCE_TO_SUN(Saturn));

2) Измените определение миль на ограниченный подтип типа Float:

SUBTYPE MILES IS FlOAT RANGE 0.0..5.0E9;

Тогда оригинальный Float_Text_IO.Put будет работать нормально.

3) Так как Miles - это тип с плавающей запятой, вы можете преобразовать его, прежде чем положить:

 Ada.Float_Text_IO.Put(Item => Float(DISTANCE_TO_SUN(Saturn)));
...