3

誰かがAda言語でのチェックされていない変換の使用について私に明確に教えてもらえますか?私はpdfとnetを試しましたが、すべてが私に明確な絵を与えてくれません。

  Now i have a small piece of code shown below:

    subtype Element4_Range is integer range 1..4;
    subtype Element3_Range is integer range 1..3;
    subtype Myarr_Range is integer range 1..10;
    type Myarr3_Type is array (Myarr_Range) of Element3_Range;
    type Myarr4_Type is array (Myarr_Range) of Element4_Range;
    Myarr3 : Myarr3_Type;
    Myarr4 : Myarr4_Type := (1,2,3,3,1,3,2,1,2,1);
    Count_1 : Integer := 0;
    Count_2 : Integer := 0;
    Count_3 : Integer := 0;
    *function To_Myarr3 is new Unchecked_Conversion(Myarr4_type,Myarr3_type);*

ここでの私の疑問は、Myarr3関数が正確に何をするのかということです。

4

2 に答える 2

3

のインスタンス化はUnchecked_Conversion、これが適切かどうかをチェックせずに、ソース値のバイトをターゲットにコピーします。一部のコンパイラは、値のサイズが異なる場合に警告を発します(コンパイルオプションによって異なります)。

Element3_RangeElement4_Rangeは両方とも同じバイト数に基づいてIntegerおり、同じバイト数を使用します。したがって、両方の配列変数(Myarr3Myarr4)には同じバイト数(通常は40バイト)が必要になります。

あなたは書くことができます

Myarr3 := To_Myarr3 (Myarr4);

Myarr4現状では、初期化に使用したすべての値がの値として有効であるため、悪いことは何も起こりませんElement3_Range

しかし、あなたが持っていた場合

Myarr3 := To_Myarr3 (Myarr4'(1, 2, 3, 4, others => 1));

Myarr3(4)の有効範囲外の値が含まれることElement3_Rangeになり、コンパイラーはそれが有効でない可能性があると信じる理由がありません。これは、将来的にはsにつながる可能性がありますConstraint_Error

自分でチェックを強制することができます:

if not Myarr3 (4)'Valid then
  -- handle the error case
于 2010-04-20T11:40:33.700 に答える
2

かつて同僚がいて、unchecked_conversion代わりに「Unchcked_Copy」という名前にするべきだと主張していました。あるタイプのオブジェクトを別のタイプのオブジェクトにコピーするだけです。

したがって、To_Myarr3ルーチンはMyarr4型の配列をパラメーターとして受け入れ、Myarr3型の配列であると偽って、その中のすべての要素を式の左側にコピーします。

全体をコピーせずにオブジェクトのビューをあるタイプから別のタイプに変更したい場合は、代わりにそれらのアクセスタイプにUnchecked_Conversionを使用できます(したがって、オブジェクトへのポインターのみをコピーします)。別の方法はfor object_name'address use at、一方を他方にオーバーレイするために使用しています(ただし、両方が初期化される可能性があり、これは悪い場合があります)。しかし、本当に最善の方法は、Unchecked_Conversionを使用する必要がないようにシステムの型を設計することです

于 2010-04-20T17:58:22.583 に答える