7

「Adaプログラミング」を読んだばかりですが、'Adaでの使用方法(一重引用符)について少し混乱しています。

'参照属性に使用されていることがわかります。AAA'画像(..)、BBB'値(..)

ただし、このコードを考慮すると、次のようになります。

   type Plain_Vector (Capacity : Capacity_Subtype) is record
      Elements : Elements_Array (1 .. Capacity);
      Last     : Extended_Index := No_Index;
      Busy     : Natural := 0;
      Lock     : Natural := 0;
   end record;
 ------------------------------------------------------------------
   new Plain_Vector'(2, (Left, Right), Last => Last, others => <>)

Q1:「new」ステートメントの引数はタイプのパラメーターおよびレコードフィールドとどのように一致しますか?

 I can GUESS "2" matched "Capacity", 
             "(Left, Right)" matched "Elements", 
             "Last => Last" matched "Last"
             "Others => <>" matched "Busy" and "Lock" to let them use default value.

しかし、これは単なる推測です。これに関する公式の文法説明はありますか?

Q2:何をし'ますか?(「新しい」ステートメントで)

それは属性ですか、それとも他の意味がありますか?

Adaの「一重引用符」の使用法の概要はどこにありますか?

私はそれらの情報を見つけるために長い時間を費やしましたが、運がありませんでした。

前もって感謝します。マイル。

4

2 に答える 2

9

Ada リファレンス マニュアルのソフト コピーをお持ちの場合は、Syntax Summary で文字を検索できます'(最新バージョンでは Annex P です。目次を確認してください)。

この'文字は次の目的で使用されます。

  • 文字リテラル:'x'
  • 属性参照:Foo'Size
  • 修飾された式: Some_Type'(expression),Some_Type'Aggregate

これは、表現句 (現在は「アスペクト句」と呼ばれています) でも使用されます。これらは属性参照によく似ています: for Foo'Size use 32;.

もちろん、コメント、文字列、または文字リテラルに表示することもできます。

投稿したコードの例は修飾式です。

提案: 文字リテラル以外のコンテキストでは、文字'は引用符として機能しないため、おそらくアポストロフィとして参照する必要があります。属性と修飾式の場合、「tick」と発音されることがありますFoo'Size。「foo tick size」と読みます。

(andnewは表現であり、ステートメントではありません。)

于 2011-09-27T04:53:36.033 に答える
5

あなたは具体的に修飾された表現について質問しているようです(キースの答えの3番目の箇条書き)。

Adaでは、異なるタイプの2つのオブジェクトがある場合、次のように、関数名のような宛先タイプの名前を使用して、それらの間で変換を試みることができます。

Foo:定数整数:=整数(2.35);

通常、これは、両方のタイプが数値タイプである場合、または一方が他方から派生している場合(type New_Type is new Old_Type...として宣言されている場合)にのみ機能します。

もちろん、コンパイラーは、値が宛先タイプが持つ可能性のある制約内にあることを確認するためのコードを追加する必要があります。しかし、これは単純な型変換には非常に便利です。

ただし、式を処理する場合、必要なのは変換ではなく、式を作成するタイプをコンパイラーに指示することです。これを行うために(実行時の)コードは必要ありません。式を私が指示するタイプにするだけです。

コンパイラーは通常、コンテキストからこれを理解できますが、理解できない場合もあります。これがそのアポストロフィの出番です。これは、式を指定された型に変換するのではなく、そもそもその型として作成するようにコンパイラーに指示します。

これの最も一般的な使用法は、例に示すように、動的割り当てを実行する場合です。ただし、それが必要な他の状況がある場合もあります。1つの例は、リテラル値をオーバーロードされたルーチンに渡す場合です。プロシージャの2つのバージョンがありMy_Routine、1つはを取り込んで、もう1つIntegerは異なるカスタム整数型を取り込んでいるとします。オブジェクトを渡すと、コンパイラはオブジェクトの型を確認できます。ただし、リテラルを渡す1と、式があいまいであるというコンパイラエラーが発生する可能性があります。

これを解決するには、リテラル1を定数整数に入れてそれを渡します(次に、愚かなcompiilerについて不平を言います)。ただし、簡単な方法は次のとおりです。

My_Routine (Integer'(1));

これにより、コンパイラのあいまいさが解消されます。これは「変換」ではないため、追加のコードは必要ありません。次の式は型であるとコンパイラに伝えているだけですInteger

于 2011-09-27T13:05:09.057 に答える