Ada汇编的困惑

问题描述 投票:1回答:2

我正在努力学习Ada中的OOP。为此,我需要了解如何用gnatmake来命名、编译和链接包文件。

这个网站 (http:/www.infres.enst.fr~pautetAda95chap22.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.)
ada gnat
2个回答
7
投票

的文件 e_c22_p2.ada 包含两个程序单元,即规格和包的主体。Conveyance1.

许多Ada编译器都会很乐意这样做,而且要说服GNAT按原样接受它也有一定的难度,但GNAT默认的做法是每个文件都有一个程序单元,文件名与单元名的大小写相等(点用连字符代替),而且 .ads 为规范。.adb 为主体。

GNAT自带的工具 gnatchop (见 此处)的输入文件,如您的 e_c22_p2.ada 并将它们分割成GNAT所期望的源文件(conveyance1.adsconveyance1.adb).


0
投票

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

  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)文件,如下所示,然后在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

它也会编译你所包含的包。

© www.soinside.com 2019 - 2024. All rights reserved.