Ada编译混乱

Ada compilation confusion

我正在努力了解 Ada 中的 OOP。为此,我需要了解如何使用 gnatmake 命名、编译和 link 打包文件。

这个网站(http://www.infres.enst.fr/~pautet/Ada95/chap22.htm)有很好的例子,但我不明白如何编译程序的各个部分。

我正在查看 e_c22_p2.ada 和 e_c22_p3.ada。从这些我创建了一个名为 Conveyance1.ads 的文件并将 e_c22_p2 的内容添加到其中,以及一个名为 Vehicle1.adb 的文件并在其中添加了 e_c22_p3.ada 的内容。我用了gnatmake Vehicle1.adb,但是有编译错误

e_c22_p2.ada 包含:

                                            -- Chapter 22 - Program 2
package Conveyance1 is 

   -- This is a very simple transportation type.
   type TRANSPORT is
      record
         Wheels : INTEGER;
         Weight : FLOAT;
      end record;

   procedure Set_Values(Vehicle_In : in out TRANSPORT; 
                        Wheels_In  : INTEGER;
                        Weight_In  : FLOAT);
   function Get_Wheels(Vehicle_In : TRANSPORT) return INTEGER;
   function Get_Weight(Vehicle_In : TRANSPORT) return FLOAT;


   -- This CAR type extends the functionality of the TRANSPORT type.
   type CAR is new TRANSPORT;

   function Tire_Loading(Vehicle_In : CAR) return FLOAT;

end Conveyance1;




package body Conveyance1 is

-- Subprograms for the TRANSPORT record type.
procedure Set_Values(Vehicle_In : in out TRANSPORT; 
                     Wheels_In  : INTEGER; 
                     Weight_In  : FLOAT) is
begin
   Vehicle_In.Wheels := Wheels_In;
   Vehicle_In.Weight := Weight_In;
end Set_Values;

function Get_Wheels(Vehicle_In : TRANSPORT) return INTEGER is
begin
   return Vehicle_In.Wheels;
end Get_Wheels;

function Get_Weight(Vehicle_In : TRANSPORT) return FLOAT is
begin
   return Vehicle_In.Weight;
end Get_Weight;


-- Subprogram for the CAR record type.
function Tire_Loading(Vehicle_In : CAR) return FLOAT is
begin
   return Vehicle_In.Weight / FLOAT(Vehicle_In.Wheels);
end Tire_Loading;

end Conveyance1;




-- Results of execution
--
-- (This package cannot be executed alone.)

文件 e_c22_p2.ada 包含两个程序单元,规范和包体 Conveyance1

许多 Ada 编译器对此非常满意,说服 GNAT 按原样接受它可能会有些困难,但 GNAT 的默认设置是期望每个文件有一个程序单元,文件名等于小写的单位名称(点由连字符代替),.ads 用于规范,.adb 用于正文。

GNAT 附带了一个工具 gnatchop(请参阅 here),它可以获取输入文件,例如您的 e_c22_p2.ada,并将它们拆分为 GNAT 期望的源文件(conveyance1.adsconveyance1.adb).

正如 Simon 所提到的,这个 .ada 文件有两个部分:specs 和 body。 所以创建两个文件如下:

  1. Conveyance1.ads - 它包含函数、过程、变量的声明

  2. Conveyance1.adb - 它包含函数、过程的主体

    第一个文件

-- Conveyance1.ads
---------------------------------------------------------------------------------
    package Conveyance1 is 

   -- This is a very simple transportation type.
   type TRANSPORT is
      record
         Wheels : INTEGER;
         Weight : FLOAT;
      end record;

   procedure Set_Values(Vehicle_In : in out TRANSPORT; 
                        Wheels_In  : INTEGER;
                        Weight_In  : FLOAT);
   function Get_Wheels(Vehicle_In : TRANSPORT) return INTEGER;
   function Get_Weight(Vehicle_In : TRANSPORT) return FLOAT;


   -- This CAR type extends the functionality of the TRANSPORT type.
   type CAR is new TRANSPORT;

   function Tire_Loading(Vehicle_In : CAR) return FLOAT;

end Conveyance1;

和第二个文件,

-- Conveyance1.adb
------------------------------------------------------------------
package body Conveyance1 is

-- Subprograms for the TRANSPORT record type.
procedure Set_Values(Vehicle_In : in out TRANSPORT; 
                     Wheels_In  : INTEGER; 
                     Weight_In  : FLOAT) is
begin
   Vehicle_In.Wheels := Wheels_In;
   Vehicle_In.Weight := Weight_In;
end Set_Values;

function Get_Wheels(Vehicle_In : TRANSPORT) return INTEGER is
begin
   return Vehicle_In.Wheels;
end Get_Wheels;

function Get_Weight(Vehicle_In : TRANSPORT) return FLOAT is
begin
   return Vehicle_In.Weight;
end Get_Weight;


-- Subprogram for the CAR record type.
function Tire_Loading(Vehicle_In : CAR) return FLOAT is
begin
   return Vehicle_In.Weight / FLOAT(Vehicle_In.Wheels);
end Tire_Loading;

end Conveyance1;

这2个是ada包文件。 为了使用这些,您需要创建另一个 .adb(比如 demo.adb)文件,如下所示。 然后'with'和'use'这些文件在demo.adb

-- demo.adb
------------------------------------------------------------------
with Conveyance1; use Conveyance1;
with Ada.Text_IO; use Ada.Text_IO;


procedure demo is
    my_scooter : TRANSPORT;
begin

    Set_Values(my_scooter, 3, 250.00);    -- it has a sidecar as well !!!!

end demo;

然后最后用

编译你的代码
gnatmake demo.adb

它也会编译你包含的包。