2012-05-05 1 views
2

Этот пост является продолжением предыдущего поста:Ada: Использование значений построенных объектов

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; 

Теперь вопрос (на основе):

Я создал объект Configuration, как показано выше, удерживая горизонтальные и вертикальные компоненты Basis_R. Если я хочу, чтобы получить доступ сказать горизонтальную составляющую Configuration, следующее не работает:

aa := Rectangular_Form.Configuration.Rectangular.Horz; 

(после определения aa быть типа Long_Float)

Я попытался различные выражения для доступа к компоненты объекта Configuration, но напрасно.

Любая помощь была бы очень признательна.

Спасибо ...

+1

'Configuration' в * Тип * является' Rectangular_Form.Rectangular' , но его * имя * - это просто «Конфигурация». –

+0

@ Simon Wright Спасибо. Мне пришло в голову, что «Конфигурация» - это объект, который имеет компоненты «Horz» и «Vert», к которым можно получить доступ непосредственно в форме * object.component *. 1 голос вверх. – yCalleecharan

ответ

3

Цель ваших функций Get_Horz и Get_Vert является извлечение компонентов вашего прямоугольного объекта:

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

@ Marc C Большое спасибо. Я думал, что мы должны иметь что-то вроде формы. Configuration.Rectangular.Horz'. Это меня вводило в заблуждение. 1 голос вверх. – yCalleecharan

Смежные вопросы