2016-11-14 1 views
1

Ada Genericパッケージでは、入力した要素を扱うパッケージがある場合、パッケージが動作していることを実証したい場合、Integerを表示するために2つの別個のクライアントプログラムを実行する必要があります。フロート、または私は同じプログラムですべてを行うことができますか?Ada汎用パッケージの場合

+1

あなたは何度でもとして一般的なパッケージをインスタンス化することができます単一のプログラムで、さまざまなタイプのような異なる汎用パラメーターを使用したいとします。それぞれには独自の名前がありますので、あいまいさはありません。 –

+0

しかし、私はAda.Integer_Text_IOを持っているとしましょう。プログラム全体を通して、整数または浮動小数点のどちらを行うかが固定されています –

+0

Ada.Float_Text_IOはfloatを実行します。あなたは両方とも "一緒にいる"ことができます。 Put(2)が別の関数を呼び出す間、Put(2.0)は1つの関数を呼び出します。 –

答えて

1

汎用パラメータには、パッケージに渡される汎用データタイプを印刷するための汎用プロシージャパラメータが含まれている必要があります。これにより、データ型は何でも可能になり、汎用パッケージのライターは出力の仕方に関心を持つ必要はありません。

generic 
    type element_type is private; 
    with procedure Print(Item : element_type); 
package gen_pack is 
    ... 
end gen_pack; 
0

IIUC、「内側」のパッケージには、あまりにも、少なくとも限りテストが行​​くように、外側のパッケージの一般的な形式的なタイプに依存ものです。次に、2つのケースがあります。

  1. 内側のパッケージは、Integer_Text_IOよう無地のパッケージであれば、それだけで符号付き整数型を扱うことができ、それはコンパイル時のことです。

  2. 内部パッケージは、外部汎用パッケージの汎用正式タイプを使用してインスタンス化することによって得られる種類のものです。最初のケースで

Integer_Text_IOが浮動小数点オペランドのために作られていないため、コンパイラが行うが、拒否することができるものは、ありません。したがって、別々のテストケースを設定する必要があります。

2番目のケースでは、結果は「内部インスタンス」に依存します。コンパイラは、型が与えられたときにジェネリックパッケージを作成することができないため、存在する汎用パッケージのみをインスタンス化することができます。後者は、正式な要件に合致していなければなりません。つまり、外部ジェネリックとインスタンス化される内部ジェネリックのジェネリックフォーマルタイプが一致しなければなりません。すなわち、range <>digits <>のような相互に排他的なカテゴリからのものであってはなりません。

時には、1がそれ外ジェネリックの仮パラメータとすることにより、「内側のジェネリック」の要件を指定することができることを考えると、価値がある:

generic 
    type X (<>) is limited private; 
package Taking_Any is 
    -- ... operations for both FPT and integer types 
end Taking_Any; 

generic 
    type T is private; 
    with package Works_With_Any is new Taking_Any (<>); 
package Outer is 
    package Any_Instance is new Taking_Any (T); 
end Outer; 
関連する問題