Ada: Zrozumienie prywatnych typów i zrozumienie opakowania
Próbuję nauczyć się korzystać z prywatnych deklaracji w Adzie, a także zrozumieć opakowanie. Starałem się, aby moje kody były jak najkrótsze.
Zaczynamy od głównego plikurectangular_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>
To mówi nam, że możemydwa wdrożenia i to na razieRectangular_Method_1
został wybrany.
Następnie mamy plik specyfikacjiRectangular_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>
i jego ciałoRectangular_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>
i wreszcie skrypt testowy: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>
Pytanie (dotyczytest_rectangular_form.adb
):
Dostaję komponentyA.Horz
iA.Vert
bezpośrednio przy użyciu
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
i dostęp do komponentów poziomych i pionowych później, po prostu używając
<code> Rectangular_Form.Get_Horz (Basis_r) </code>
i
<code> Rectangular_Form.Get_Vert (Basis_r) </code>
Wydaje mi się, że korzystam z tych metodGet_Horz
iGet_Vert
aby uzyskać dostęp doprywatny Prostokątny poziome i pionowe elementy. Czytam jednak zmiennąTheta
bezpośrednio z wiersza poleceń i znajdowanie jego poziomych i pionowych komponentów za pomocą
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
JeśliProstokątny składnikiA.Horz
iA.Vert
są prywatne, tak jak je zdefiniowałem,dlaczego nie muszę korzystać z metodset_Horz(A)
iset_Vert(A)
wcześniejszy do wydania polecenia
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
PS: Funkcje dlaSet_Vert
iGet_Vert
zostały pominięte, aby zachować krótkie kody.
Wielkie dzięki...