Ада: доступ к переменной записи - PullRequest
0 голосов
/ 19 марта 2012

Привет, я делаю программу для расчета векторных компонентов. Поскольку в двухмерных векторах в декартовом пространстве есть горизонтальный и вертикальный компонент, я решил использовать конструкцию 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" *.

Есть предложения, что я делаю не так?

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

Файл main равен 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;

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

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

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

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

2 голосов
/ 19 марта 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;

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

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;
...