Объркване при компилация на Ada

Опитвам се да разбера ООП в Ada. За да направя това, трябва да разбера как да именувам, компилирам и свързвам пакетни файлове с 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.)

person cadebe    schedule 01.09.2015    source източник
comment
Вижте този отговор. TL;DR - използвайте gnatchop на изходните файлове (e_c22_p2.ada и т.н.), за да създадете изходните файлове, които GNAT очаква.   -  person Simon Wright    schedule 01.09.2015
comment
Има ли смисъл едно транспортно средство да има колела -42?   -  person Jacob Sparre Andersen    schedule 02.09.2015
comment
@JacobSparreAndersen, да, така е - когато транспортирате междуконтинентални балистични ракети (или други големи неща), това вероятно е за количеството колела, които ще има такова превозно средство.   -  person darkestkhan    schedule 02.09.2015
comment
@darkestkhan - Мисля, че си пропуснал знака. ;-)   -  person Jacob Sparre Andersen    schedule 04.09.2015
comment
@JacobSparreAndersen О, момче, прав си - пропуснах го xD (-42 колела? липсва кола с 42 колела?)   -  person darkestkhan    schedule 05.09.2015


Отговори (2)


Файлът e_c22_p2.ada съдържа две програмни единици, спецификацията и тялото на пакет Conveyance1.

Много компилатори на Ada биха били доста доволни от това и е възможно с известна трудност да се убеди GNAT да го приеме такъв, какъвто е, но GNAT по подразбиране е да очаква една програмна единица на файл, като името на файла е равно на името на единицата в по-ниските регистър (точките са заменени с тирета) и .ads за спецификацията, .adb за тялото.

GNAT идва с инструмент gnatchop (вижте тук), който взема входни файлове като вашия e_c22_p2.ada и ги разделя на изходните файлове, които GNAT очаква (conveyance1.ads и conveyance1.adb).

person Simon Wright    schedule 01.09.2015
comment
Благодаря ви много, че изчистихте този проблем. Наистина ми е трудно да се опитам да обхвана някои от концепциите в Ада. Изглежда, че няма много лесни за използване справочни материали онлайн, а книгите, до които се сдобих, също не са от голяма полза. - person cadebe; 03.09.2015
comment
Погледнахте ли тук? Хората говорят високо за Ada Distilled. - person Simon Wright; 05.09.2015

Както спомена Саймън, този .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

ще компилира и вашите включени пакети.

person Rudra Lad    schedule 29.04.2020