2

次のように、Ada95 の ans 仕様ファイルで 2 つの整数範囲を定義しました。

type year is new integer range 1996..2100;
type month is new integer range 1..12;

本体ファイルのコードをコンパイルしているとき、次のようなコード行があります。

....
    key: integer;
begin 
    key:= (yearVal*100) + monthVal;

YearVal は年型で monthVal は月型ですが、次のエラーが発生します

コンパイル:演算子「+」の無効なオペランド タイプ

この値を加算して整数を取得するにはどうすればよいですか? ありがとう!

4

3 に答える 3

4

型変換を使用します。

于 2011-06-16T23:37:19.050 に答える
4

構造を使用すると、新しいタイプX is newが作成されます。他のタイプとは互換性がなく、他のタイプとのみ相互作用する独自の世界に存在する必要があります。X

これは、計算を実行する可能性のあるすべてのオブジェクトが同じタイプ (同じユニバースで動作する) であることを確認するために、事前にタイプ戦略を考えておく必要があることを意味します。

代わりに、 の許容範囲に境界を設定したいがX、他の整数を使用した数式で動作できるようにする場合は、代わりに subtypesを次のように使用する必要があります。

subtype year is integer range 1996..2100;

(メモなしnew)。

ただし、本当にYears とMonths を独自の互換性のないユニバースに配置したいが、変換のために計算を行う必要があるこの 1 つの内部ケースがある場合は、この 1 つのケースでそれらを整数に変換することができます。

key:= (Integer(yearVal)*100) + Integer(monthVal);

繰り返しますが、これらのオブジェクトを何かに使用するたびにこれを行う必要がある場合、これは主要な PITA になります。その場合は、同じタイプ (おそらく整数) のサブタイプにする必要があります。

于 2011-06-17T13:05:17.657 に答える
2

前述のように、型変換を使用するか、型の代わりにサブタイプを使用してください。以前にサブタイプを使用したことがない場合は、次のようにします。

   subtype year is Integer range 1996 .. 2100;
   subtype month is Integer range 1 .. 12;
   yearVal : year;
   monthVal : month;

その後、自由に行うことができます:

   key : Integer;
begin
   key := (yearVal*100) + monthVal;
于 2011-06-17T11:43:23.637 に答える