2012-05-05 3 views
2

이 포스트의 값을 사용하면 이전 게시물의 후속이다 :에이다 : 건설 객체

Ada: Understanding private types and understanding packaging

내가 Configuration라는 이름의 객체를 생성 화면에 인쇄하려고 나는 할 수 있도록 그 내용을보고이 생성 된 객체의 컴포넌트에 접근하려고 시도하십시오. 그것은 내게 문제가되는 마지막 부분입니다.

먼저 패키지 사양 Rectangular_Method.ads :

package Rectangular_Method is 
type Rectangular is private; 

function Construct(Horz, Vert : Long_Float) return Rectangular; 

procedure Print(Configuration: in Rectangular); 

procedure Vector_Basis_r (A : in Long_Float; D : out Rectangular); 

function Get_Horz (R : Rectangular) return Long_Float; 
function Get_Vert (R : Rectangular) return Long_Float; 

private 
type Rectangular is 
    record 
     Horz, Vert: Long_Float; 
    end record; 

end Rectangular_Method; 

다음, 패키지 본체 Rectangular_Method.adb : 코드는 다음 주어진

with Ada.Text_IO, Ada.Long_Float_Text_IO; 
with Ada.Numerics.Long_Elementary_Functions; 
use Ada.Numerics.Long_Elementary_Functions; 

package body Rectangular_Method is 

function Construct(Horz, Vert : Long_Float) return Rectangular is 
begin 
    return(Horz, Vert); 
end Construct; 

procedure Print(Configuration: in Rectangular) is 
use Ada.Text_IO, Ada.Long_Float_Text_IO; 
    begin 
Put("("); 
Put(Configuration.Horz, Fore => 2, Aft => 2, Exp => 0); Put(", "); 
Put(Configuration.Vert, Fore => 2, Aft => 2, Exp => 0); 
Put_Line(")"); 
    end Print; 

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; 

function Get_Horz (R : Rectangular) return Long_Float is 
begin 
    return R.Horz; 
end Get_Horz; 

function Get_Vert (R : Rectangular) return Long_Float is 
begin 
    return R.Vert; 
end Get_Vert; 
end Rectangular_Method; 

그리고 마지막으로 테스트 파일 test_rectangular_form.adb :

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 

Theta         : Long_Float; 
Basis_r        : Rectangular_Form.Rectangular; 

Configuration: 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); 

    Configuration := Rectangular_Form.Construct(Rectangular_Form.Get_Horz (Basis_R),Rectangular_Form.Get_Vert (Basis_R)); 
    Ada.Text_IO.New_Line; 
    Rectangular_Form.Print(Configuration); 

end Test_Rectangular_Form; 

이제 질문 (01 23,)의 수평 및 수직 성분 Basis_R 채 위와 같이 I 개체 Configuration를 작성한

. 내가 Configuration의 수평 성분 말에 액세스하려면, 다음이 작동하지 않습니다

aa := Rectangular_Form.Configuration.Rectangular.Horz; 

나는 액세스하기 위해 다양한 표현을 시도

(유형 Long_Float의 수 aa을 정의 후) 객체의 구성 요소는 헛되이 Configuration입니다.

모든 도움을 주시면 감사하겠습니다.

감사합니다 ...

+1

'Configuration'의 * 유형 *'Rectangular_Form.Rectangular'입니다 , 그 * name *은 단지'Configuration'입니다. –

+0

@ Simon Wright 감사합니다. 나는'Configuration'이 * object.component * 형태로 직접 접근 할 수있는 Horz와 Vert 컴포넌트를 가진 객체라고 생각하게되었습니다. 1 표지지. – yCalleecharan

답변

3

당신의 Get_Horz 및 Get_Vert 기능의 목적은 당신의 사각형 객체의 구성 요소를 검색하는 것입니다 :

aa := Rectangular_Form.Get_Horz(Configuration); 
+0

@ Marc C 고마워. 나는 우리가'Configuration.Rectangular.Horz'라는 형식을 가지고 있어야한다고 생각했습니다. 이것은 나를 오인했다. 1 표지지. – yCalleecharan