【问题标题】:Ada compilation confusionAda 编译混乱
【发布时间】:2015-09-01 16:03:04
【问题描述】:

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

这个网站(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.)

【问题讨论】:

  • this answer。 TL;DR - 在源文件(e_c22_p2.ada 等)上使用 gnatchop 来创建 GNAT 期望的源文件。
  • 交通工具有-42个轮子有意义吗?
  • @JacobSparreAndersen 是的,确实如此 - 当您运输洲际弹道导弹(或其他大件物品)时,可能与此类车辆的车轮数量有关。
  • @darkestkhan - 我想你错过了这个标志。 ;-)
  • @JacobSparreAndersen 哦,孩子,你是对的 - 我确实错过了 xD(-42 个轮子?缺少 42 个轮子的汽车?)

标签: ada gnat


【解决方案1】:

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

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

GNAT 附带一个工具gnatchop(请参阅here),它接收像e_c22_p2.ada 这样的输入文件,并将它们拆分为GNAT 期望的源文件(conveyance1.adsconveyance1.adb)。

【讨论】:

  • 非常感谢您解决此问题。我很难理解 Ada 中的一些概念。网上好用的参考资料好像不多,手上的书也帮不上什么忙。
  • 你看过here吗?人们高度评价Ada Distilled
【解决方案2】:

正如 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;

这两个是 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

它也会编译你包含的包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多