Путаница при компиляции Ады

Я пытаюсь понять ООП в Аде. Для этого мне нужно понять, как именовать, компилировать и связывать файлы пакетов с помощью 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.

Многие компиляторы Ады были бы вполне довольны этим, и с некоторыми трудностями можно убедить 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
Вы смотрели здесь? Люди высоко отзываются о Ада Дистиллед. - 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