Ada:访问记录变量

时间:2012-03-19 11:37:38

标签: record ada

您好我正在制作计算矢量分量的程序。由于2D向量在笛卡尔空间中具有水平垂直组件,因此我决定使用记录构造。

程序首先计算基矢量,这是如下所示。 水平垂直组件以及角度被要求作为输入。 角度是指从默认笛卡尔坐标系到另一个旋转笛卡尔坐标系的逆时针正角度。

在文件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;

非常感谢...

2 个答案:

答案 0 :(得分:4)

Rectangular是一种私有类型,因此其他包在这种情况下无法访问其组件Horz(或Vert)。 Rectangular类型的字段只能由Projections的包体访问,或者在Projections的任何子包的私有部分中访问。

将Rectangular类型声明放在包Projections的公共部分中,或者提供Get / Set访问器以与记录的组件进行交互。

答案 1 :(得分:2)

我会在投影包中添加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);

并且作为看跌期权的主体:

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;