2012-03-19 5 views
0

こんにちは私はベクトル成分を計算するプログラムを作っています。 2Dベクトルは、デカルト空間内にの水平の垂直の成分を持っているので、私はのレコードを使用することに決めました。Ada:レコード変数にアクセス

プログラムは、まず基底ベクトルを計算します。これは以下のとおりです。 の水平,の垂直のコンポーネントと、の角度の入力が求められます。 の角度は、デフォルトのデカルト座標系から元のデカルト座標系への反時計回りの正の角度を指します。

Aが元のデカルト座標系と C水平コンポーネントが新しいデカルト座標系の間の回転を表す角度である
D.Horz := A * Cos (C); 

:ファイルProjections.adbもし計算が表示されますで

と古いシステム。 メインプログラム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; 

おかげでたくさん...

答えて

4

長方形プライベートタイプである、したがって、他のパッケージは、この場合には、その構成要素、ト水平(またはヴェール)へのアクセスを持っていません。 Rectangular型のフィールドは、Projectionsのパッケージ本体、またはProjectionsの子パッケージの本体にのみアクセスできます。

矩形の宣言をPackage Projectionsのパブリック部分に配置するか、Get/Setアクセサを使用してレコードのコンポーネントとやりとりします。

+0

をマルク・C @本当にありがとうございました。私は単に私的な部分を取り除いただけです。レコードのコンポーネント*とやりとりするために* Get/Setアクセサを提供しなければならない場合、どうすればいいですか?あなたは例を見せていただけますか? 1票アップ。 – yCalleecharan

+0

@yCalleecharan "Get/Setアクセサ"とは、Rectangleパラメータを受け取り、そのメンバにアクセスする関数だけを意味します。例えば。 "関数Get_Horz(R:Rectangle)はLong_Floatを返します;" "Set_Horz(R:in Rectangle; H:Long_Float);" –

+0

@ Marc Cありがとうございます。私はこれにはかなり新しいです。関数として 'adb'ファイルに関数を書くことができますGet_Horz(R:Rectangular)return Long_Floatは begin return R.Horzです。 end Get_Horz ;.この部分はOKです:私は 'Set_Horz ...プロシージャ 'を理解していません。あなたはそれを私のために完全に書き留めていただけますか?どうもありがとうございます。 – yCalleecharan

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; 
+0

@ NWS優れた選択肢と感謝。私は 'put'手続きの本文を' Projections.adb'ファイルに入れました。それはうまく動作します。 1票アップ。 – yCalleecharan

+0

'Ada.Text_IO.File_Type'パラメータ(' Fore'、 'Aft'、' Exp'ではなく)を追加してください。 –

+0

@SimonWright - 定義されたプットメソッドをエミュレートしようとしていた場合は修正します(おそらく私のputはprint_horizo​​ntalの名前を変更してより正確にする必要があります)。 – NWS