Ада: Понимание частных типов и понимание упаковки
Я пытаюсь научиться использовать частные объявления в Аде, а также понять, как упаковывать. Я пытался сделать свои коды как можно короче.
Начнем с основного файлаrectangular_Form.ads
<code>with Rectangular_Method_1; package Rectangular_Form renames Rectangular_Method_1; -- with Rectangular_Method_2; -- package Rectangular_Form renames Rectangular_Method_2; </code>
Это говорит нам о том, что мы можем иметьtwo реализации и что на данный моментRectangular_Method_1
был выбран.
Тогда у нас есть файл спецификацийRectangular_Method_1.ads
:
<code>package Rectangular_Method_1 is type Rectangular is private; procedure Vector_Basis_r (A : in Long_Float; D : out Rectangular); procedure Set_Horz (R : in out Rectangular; H : Long_Float); function Get_Horz (R : Rectangular) return Long_Float; private type Rectangular is record Horz, Vert: Long_Float; end record; end Rectangular_Method_1; </code>
и его телоRectangular_Method_1.adb
:
<code>with Ada.Numerics.Long_Elementary_Functions; use Ada.Numerics.Long_Elementary_Functions; package body Rectangular_Method_1 is procedure Vector_Basis_r (A : in Long_Float; D : out Rectangular) is begin D.Horz := Cos (A, Cycle => 360.0); D.Vert := Sin (A, Cycle => 360.0); end Vector_Basis_r; procedure Set_Horz (R : in out Rectangular; H : Long_Float) is begin R.Horz := H; end Set_Horz; function Get_Horz (R : Rectangular) return Long_Float is begin return R.Horz; end Get_Horz; end Rectangular_Method_1; </code>
и, наконец, тестовый скрипт:test_rectangular_form.adb
:
<code>with Ada.Long_Float_Text_IO; with Ada.Text_IO; use Ada.Text_IO; with Rectangular_Form; use type Rectangular_Form.Rectangular; procedure Test_Rectangular_Form is Component_Horz, Component_Vert, Theta : Long_Float; Basis_r : Rectangular_Form.Rectangular; begin Ada.Text_IO.Put("Enter the angle "); Ada.Long_Float_Text_IO.Get (Item => theta); --Vector basis Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); Ada.Text_IO.New_Line; Ada.Text_IO.Put("rhat_min_theta = "); Ada.Long_Float_Text_IO.Put (Item => Rectangular_Form.Get_Horz (Basis_r), Fore => 3, Aft => 5, Exp => 0); Ada.Text_IO.Put(" ihat + "); Ada.Long_Float_Text_IO.Put (Item => Rectangular_Form.Get_Vert (Basis_r), Fore => 3, Aft => 5, Exp => 0); Ada.Text_IO.Put (" jhat "); end Test_Rectangular_Form; </code>
Вопрос (применяется кtest_rectangular_form.adb
):
Я получаю компонентыA.Horz
а такжеA.Vert
напрямую используя
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
и доступ к горизонтальным и вертикальным компонентам позже, просто используя
<code> Rectangular_Form.Get_Horz (Basis_r) </code>
а также
<code> Rectangular_Form.Get_Vert (Basis_r) </code>
Это кажется нормальным, так как я использую методыGet_Horz
а такжеGet_Vert
чтобы получить доступ кprivate Rectangular горизонтальные и вертикальные компоненты. Однако я читаю переменнуюTheta
непосредственно из командной строки и находя ее горизонтальные и вертикальные компоненты, используя
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
ЕслиRectangular компонентыA.Horz
а такжеA.Vert
являются частными, как я их определил,why do not I have to use the methods set_Horz(A)
and set_Vert(A)
prior на выдачу команды
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
PS: функции дляSet_Vert
а такжеGet_Vert
были опущены, чтобы коды были короткими.
Большое спасибо...