3

私はAdaでプライベート宣言を使用する方法を学び、パッケージングについても理解しようとしています。私は自分のコードをできるだけ短くしようとしました。

メインファイルから始めますrectangular_Form.ads

with Rectangular_Method_1;
package Rectangular_Form renames Rectangular_Method_1;
-- with Rectangular_Method_2;
-- package Rectangular_Form renames Rectangular_Method_2;

これは、2つの実装が可能であり、今のところRectangular_Method_1選択されていることを示しています。

次に、仕様ファイルがありますRectangular_Method_1.ads

package Rectangular_Method_1 is
   type Rectangular is private;

   procedure Vector_Basis_r (A : in Long_Float; D : out Rectangular);
   procedure Set_Horz (R : in out Rectangular; H : Long_Float);
   function Get_Horz (R : Rectangular) return Long_Float;

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

とその体Rectangular_Method_1.adb

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

package body Rectangular_Method_1 is
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;

procedure Set_Horz (R : in out Rectangular; H : Long_Float) is
begin
  R.Horz := H;
end Set_Horz;

function Get_Horz (R : Rectangular) return Long_Float is
begin
  return R.Horz;
end Get_Horz;

end Rectangular_Method_1;

そして最後にテストスクリプト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
Component_Horz, Component_Vert, Theta  : Long_Float;
Basis_r                                : 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);
  Ada.Text_IO.New_Line;

  Ada.Text_IO.Put("rhat_min_theta = ");
  Ada.Long_Float_Text_IO.Put (Item => Rectangular_Form.Get_Horz (Basis_r), Fore => 3, Aft  => 5, Exp  => 0);
  Ada.Text_IO.Put(" ihat + ");
  Ada.Long_Float_Text_IO.Put (Item => Rectangular_Form.Get_Vert (Basis_r), Fore => 3, Aft  => 5, Exp  => 0);
  Ada.Text_IO.Put (" jhat ");
end Test_Rectangular_Form;

質問(に適用test_rectangular_form.adb):

A.Horzコンポーネントを入手してA.Vert直接使用しています

    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

後で使用するだけで水平コンポーネントと垂直コンポーネントにアクセスできます

    Rectangular_Form.Get_Horz (Basis_r)

    Rectangular_Form.Get_Vert (Basis_r)

メソッドGet_Horzを使用していて、プライベートの長方形の水平コンポーネントと垂直コンポーネントGet_Vertにアクセスして いるので、これは問題ないようです。ただし、コマンドラインから直接変数を読み取り、を使用してその水平成分と垂直成分を見つけています Theta

    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

長方形のコンポーネントA.HorzA.Vert私が定義したようにプライベートである場合、コマンドを発行する前にメソッド使用する必要がないのはなぜですか?set_Horz(A)set_Vert(A)

    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

PS:コードを短くするためにSet_Vertとの関数Get_Vertは省略されました。

どうもありがとう...

4

1 に答える 1

4

コマンドを発行する前に、メソッドset_Horz(A)およびset_Vert(A)を使用する必要がないのはなぜですか

次のコマンドを実行してプライベートレコードのフィールドを設定しているためです。

rectangular_Form.Vector_Basis_r(A => Theta、D => Basis_r);

(Vector_Basis_rの実装を確認してください。)

-拡張された回答

Test_Rectangular_FormプロシージャでBasis_r変数を宣言すると、その「Rectangular」変数のメモリが割り当てられます。この時点で、プライベートタイプのHorzフィールドとVertフィールドは存在しますが、設定されていません(これらには何でも含めることができます)。

rectangular_Form.Vector_Basis_rを呼び出すと、その実装によってこれらのプライベートフィールドの値が設定されます。多分これはあなたを混乱させるものです:プライベートタイプが宣言されているパッケージの本体はそれらのフィールドに直接アクセスできます。これはまさに、Vector_Basis_rが値(およびSet_VertとSet_Horz)を設定するときに利用している側面です。

于 2012-05-01T14:58:35.583 に答える