代码之家  ›  专栏  ›  技术社区  ›  yCalleecharan

如何访问这个变量?

  •  4
  • yCalleecharan  · 技术社区  · 16 年前

    我有一个修改过的教科书示例如下(这本书是由Bray和Pokrass撰写的《理解Ada——一种软件工程方法》):

    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;
    

    距离太阳(土星)。如何访问它?

    谢谢。。。

    这就是我对这句话的理解

    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;
    

    问题是到太阳(土星)的距离是MILES类型,这是浮点类型之一。所以仅仅使用Ada.Float\u Text\u IO.Put是行不通的。

    1 回复  |  直到 16 年前
        1
  •  4
  •   Marc C    16 年前

    问题是,你已经宣布了一个全新的类型,英里,这是“浮动式”,但它是 预定义的浮点类型。因此,当您尝试放置该类型的项目时,即距离太阳(土星),没有可用于该类型的放置过程。

    您有三个主要选择:

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

    然后使用Miles\u IO输出值:

     Miles_IO.Put(DISTANCE_TO_SUN(Saturn));
    

    2) 将英里的定义更改为Float的受约束子类型:

    SUBTYPE MILES IS FlOAT RANGE 0.0..5.0E9;
    

    那么原来的Float\u Text\u IO.Put就可以正常工作了。

    3) 由于Miles是一种浮点类型,因此您可以在输入之前对其进行转换:

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