您好我正在制作计算矢量分量的程序。由于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;
非常感谢...
答案 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;