2016-09-20 12 views
-1

エイダでは、私は以下のspecファイルがあります。変数の初期化

GENERIC 
    TYPE Item IS PRIVATE; --type of array 
    size : integer; --size of array 
    PACKAGE gwar IS 
    function get_size return integer; 
    END gwar; 

と身体ファイルを:

with Ada.Text_Io; 
use Ada.Text_Io; 

package body gwar is 
    --Get_Size allows the txt file to specify how much space to allocate. 
    function get_size return Integer is 
     Filename : String := "win.txt"; 
     File : Ada.Text_IO.File_Type; 
     Line_Count : Integer := 0; 
     ReturnSize : Integer; 
    begin 
     Ada.Text_IO.Open(File => File, 
         Mode => Ada.Text_IO.In_File, 
         Name => Filename); 
     while Line_Count /= 1 loop 
     declare 
      Line : String := Ada.Text_IO.Get_Line(File); 
     begin 
      ReturnSize := Integer'Value(Line); 
      Line_Count := 1; 
     end; 
     end loop; 
     Ada.Text_IO.Close (File); 
     return ReturnSize; 
    end get_size; 

begin 
    null; 
end gear; 

私は設定されてやりたい私sizeget_sizeによって返される値の整数。これどうやってするの?私はsize変数の前に私の関数を配置しようとしましたが、ファイルの終わりが予想されました。私はsize : integer := gwar.get_sizeを設定しようとしましたが、それはどちらも動作しません。これは可能ですか?

+0

あなたのサイズvarは、ジェネリック仕様の一部です。ジェネリック仕様の外に移動し、ジェネリックをインスタンス化してから、get_size関数を呼び出す必要があります。 – NWS

+0

'in out'の一般的な形式の' size'を作ることができます - [ARM 12.4](http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-12-4.html) –

答えて

2

manuBriot'sのコメントを考慮すると、Simon Wrightの提案に技術的に従うことができます。私はいくつか省略して、ジェネリック自身のジェネリックパラメータに値を割り当てる方法に焦点を当てました。あなたがジェネリックをインスタンス化する場合、インスタンスの体の効果は、値2にパラメータsizeを設定することになります

GENERIC 
    TYPE Item IS PRIVATE; --type of array 
    size : in out integer; --size of array 
PACKAGE gwar IS 
    function get_size return integer; 
END gwar; 

with Ada.Text_Io; 
use Ada.Text_Io; 

package body gwar is 

    function get_size return Integer is 
     ReturnSize : Integer; 
    begin 
     ReturnSize := Integer'Value("2"); 
     return ReturnSize; 
    end get_size; 

begin 
    Size := Get_Size; 
end gwar; 

この方法では、エラーなしでそのget_sizeリターンを提供します。

2

送信時に、コードが奇妙に見えます。ここでは様々な矛盾の簡単なレビューです:

  • 2つの仮パラメータItemSizeは、パッケージの実装で使用されていません。あなたは一般的なパッケージは必要ありません。 Get_Sizeは関数であり、どこにでも情報を格納する必要はありません(呼び出し元は別のパッケージではもちろん、ローカル変数に格納することもできます)。可能であれば副作用のない関数を持つ方が良いLine_Countは常に1に設定されているので、ループは一度だけ実行されます。

  • Get_Sizeでは、ループは一度だけ実行されます。ファイルのサイズを計算する優れた関数があります。たとえば、行数をカウントする必要がある場合は、GNATCOLL.Mmapを使用してメモリ内のファイル全体を一度に読み取ることを検討してください。それはより速くなります。

  • たとえば、ファイルがディスクに存在しないか、読み取り不能な場合など、例外を処理する必要があります。

  • Get_Sizeのドキュメントは、パッケージのユーザーがそのドキュメントを見ることができるように、本文の方が仕様よりも優れています。それはあなたが使用しているかどうGPSエディタは、Get_Sizeへのすべての参照にツールチップが表示され、あなたが望むすべてはあなたが見なければならないファイルのサイズを決定することであるならば、これらのツールチップには、ドキュメント

1

が含まれますパッケージAda.Directories。このパッケージのドキュメントは、「Ada言語リファレンスマニュアル」のセクションA.16にあります。 GPS開発環境を使用している場合は、[ヘルプ]メニューから[Ada言語リファレンスマニュアル]にアクセスできます。

Ada.Directoriesパッケージには、ファイルを操作して理解するための豊富な機能と手順が含まれています。たとえば、関数Existsはファイル名をパラメータとして取り、名前付きファイルが存在するかどうかを示すブール値を返します。また、ファイル名をパラメータとし、ファイルのサイズを返す関数Sizeがあります。

ファイルのサイズを調べようとする前に、ファイルが存在するかどうかを確認するのが理にかなっています。

+0

サイズアレイの私はサイズ変数を使用して配列内のスペースを割り当てます –