Ада: доступ к переменной записи

Привет, я делаю программу для расчета векторных компонентов. Поскольку двумерные векторы имеют горизонтальную и вертикальную компоненты в декартовом пространстве, я решил использовать конструкцию record.

Программа сначала вычисляет базисный вектор, и это показано ниже. В качестве входных данных запрашиваются горизонтальные, вертикальные компоненты, а также угол. угол относится к положительному углу против часовой стрелки от декартовой системы координат по умолчанию к другой повернутой декартовой системе координат от исходной.

В файле Projections.adb вы увидите расчет:

D.Horz := A * Cos (C);

где A — это горизонтальная составляющая исходной декартовой системы координат, а C — это угол, обозначающий поворот между новой декартовой системой координат и старой системой.

В основной программе Get_projections.adb вызывается процедура

Vector_basis_r (Component_Horz, Component_Vert, theta, Basis_r);

Ada жалуется, когда я даю команду:

Ada.Long_Float_Text_IO.Put (Item => Basis_r.Horz, Fore => 3, Aft  => 3, Exp  => 0);

когда я хочу получить горизонтальный компонент базисного вектора.

Жалоба:

*неверный префикс в выбранном компоненте "Basis_r"*.

Любые предложения, что я делаю неправильно?

Необходимые файлы находятся здесь:

основной файл Get_Projections.adb:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Float_Text_IO;
with Projections; Use Projections;
with Ada.Numerics.Long_Elementary_Functions;
use Ada.Numerics.Long_Elementary_Functions;


procedure Get_Projections is

   Component_Horz, Component_Vert, theta  : Long_Float;
   Basis_r                                : Rectangular;

begin

  Ada.Text_IO.Put("Enter the horizontal component ");
  Ada.Long_Float_Text_IO.Get (Item => Component_Horz);
  Ada.Text_IO.New_Line (1);
  Ada.Text_IO.Put("Enter the vertical component ");
  Ada.Long_Float_Text_IO.Get (Item => Component_Vert);
  Ada.Text_IO.New_Line (1);
  Ada.Text_IO.Put("Enter the angle ");
  Ada.Long_Float_Text_IO.Get (Item => theta);

  Vector_basis_r (Component_Horz, Component_Vert, theta, Basis_r);


  Ada.Text_IO.New_Line;
  Ada.Text_IO.Put("rx = ");
  Ada.Long_Float_Text_IO.Put (Item => Basis_r.Horz, Fore => 3, Aft  => 3, Exp  => 0);

end Get_Projections;

а сопровождающие пакеты — это спецификация Projections.ads:

package Projections is

   type Rectangular is private;
   procedure Vector_basis_r (A, B, C : in Long_Float; D : out Rectangular);

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

end Projections;

и тело пакета Projections.adb:

with Ada.Numerics.Long_Elementary_Functions;
use  Ada.Numerics.Long_Elementary_Functions;

package body Projections is

   procedure Vector_basis_r (A, B, C : in Long_Float; D : out Rectangular) is
   begin
      D.Horz := A * Cos (C);
      D.Vert := B * Sin (c);
   end Vector_basis_r;

end Projections;

Большое спасибо...


person yCalleecharan    schedule 19.03.2012    source источник


Ответы (2)


Rectangular является закрытым типом, поэтому другие пакеты не имеют доступа к его компонентам, в данном случае Horz (или Vert). Доступ к полям типа Rectangular возможен только из тела пакета Projections или в приватной части или телах любых дочерних пакетов Projections.

Либо поместите объявление типа Rectangular в общедоступную часть пакета Projections, либо предоставьте методы доступа Get/Set для взаимодействия с компонентами записи.

person Marc C    schedule 19.03.2012
comment
@ Marc C Большое вам спасибо. Я просто убрал часть private. Если бы мне пришлось предоставить аксессоры Get/Set для взаимодействия с компонентами записи, как это сделать? Не могли бы вы показать пример? 1 голос вверх. - person yCalleecharan; 19.03.2012
comment
@yCalleecharan Под средствами доступа Get/Set я подразумеваю не что иное, как функции, которые принимают параметр Rectangle и обращаются к его членам. Например. функция Get_Horz(R: Rectangle) возвращает Long_Float; и процедура Set_Horz(R : in out Rectangle; H : Long_Float); - person Marc C; 19.03.2012
comment
@ Марк С Спасибо. Я совсем новичок в этом. Я могу написать функцию в файле adb как function Get_Horz (R: Rectangular) return Long_Float is begin return R.Horz; конец Get_Horz;. Эта часть в порядке: я не понимаю procedure Set_Horz.... Не могли бы вы написать его полностью для меня? Спасибо Вам большое. - person yCalleecharan; 19.03.2012
comment
Процедура @yCalleecharan Set_Horz(R : in out Rectangle; H : Long_Float) начинается с R.Horz := H; конец Set_Horz; - person Marc C; 19.03.2012
comment
@ Марк С. Хорошо, тогда как вывести переменную, скажем, горизонтальную составляющую, используя Ada.Long_Float_Text_IO.Put? - person yCalleecharan; 19.03.2012
comment
@ Марк С. Хорошо, я понял это. Должно быть Get_Horz(Basis_r). Спасибо, что провели меня... - person yCalleecharan; 19.03.2012

Я бы поместил процедуру put в пакет прогнозов:

package Projections is

   type Rectangular is private;
   procedure Vector_basis_r (A, B, C : in Long_Float; D : out Rectangular);

   procedure put (r : in Rectangular);

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

end Projections;

Тогда ваши приватные останутся скрытыми, и вы сможете безнаказанно распечатать их.

put (basis_r);

и иметь в качестве тела put:

procedure put (r : in Rectangular) is
begin 
  Ada.Text_IO.New_Line;
  Ada.Text_IO.Put("rx = ");
  Ada.Long_Float_Text_IO.Put (Item => r.Horz, Fore => 3, Aft  => 3, Exp  => 0);
end put;
person NWS    schedule 19.03.2012
comment
@ NWS Отличная альтернатива и спасибо. Я поместил тело процедуры put в файл Projections.adb. Это работает нормально. 1 голос вверх. - person yCalleecharan; 19.03.2012
comment
Ставить действительно надо брать дополнительный параметр Ada.Text_IO.File_Type (если не Fore, Aft и Exp). - person Simon Wright; 20.03.2012
comment
@SimonWright - Исправьте, если вы пытались эмулировать определенные методы ввода (чего я не делал!), Возможно, мой ввод следует переименовать в print_horizontal, чтобы быть более точным. - person NWS; 21.03.2012