Ada: Entendendo tipos particulares e entendendo o empacotamento
Eu estou tentando aprender como usar declarações privadas em Ada e também para entender o empacotamento. Eu tentei manter meus códigos tão curtos quanto possível.
Nós começamos com o arquivo principalrectangular_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>
Isso nos diz que podemos terdois implementações e que por agoraRectangular_Method_1
foi escolhido.
Então nós temos o arquivo de especificaçõesRectangular_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>
e seu corpoRectangular_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>
e finalmente o script de teste: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>
Pergunta (aplicada atest_rectangular_form.adb
):
Estou recebendo os componentesA.Horz
eA.Vert
usando diretamente
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
e acessando os componentes horizontais e verticais mais tarde usando apenas
<code> Rectangular_Form.Get_Horz (Basis_r) </code>
e
<code> Rectangular_Form.Get_Vert (Basis_r) </code>
Isso parece OK, já que estou usando os métodosGet_Horz
eGet_Vert
para acessar oprivado Retangular componentes horizontais e verticais. No entanto eu estou lendo a variávelTheta
diretamente da linha de comando e encontrar seus componentes horizontais e verticais usando
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
Se oRetangular componentesA.Horz
eA.Vert
são privados como eu os defini,por que não tenho que usar os métodosset_Horz(A)
eset_Vert(A)
anterior para emitir o comando
<code> Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r); </code>
PS: As funções paraSet_Vert
eGet_Vert
foram omitidos para manter os códigos curtos.
Muito obrigado...