0

4 ビットである必要がある列挙型がありますが、その型の変数を宣言すると、コンパイラはその変数に 8 ビットを割り当てます。

以下は、コードの簡略化されたバージョンです。

subtype ab_range_index is word range 0..3;
type ab_buffer_type is array(ab_range_index) of bit;

type Buffer is record
   ...
   var1        : some_buffer_type;
   Orig_AB_var : ab_buffer_type; 
   ...
end record;
for Buffer use record
  ...
  var1         at 16 range 0..5;
  Orig_AB_var  at 16 range 6..9;
  ...
end record;
...
type AB_type is (A,B);
for AB_type use (A => 0, B => 5);
for AB_type'Size use 4;
...
procedure Proc(AB_buff : ab_buffer_type) is 
AB_var : AB_type;                      -- AB_var'Size returns 8 in debugger.
for AB_var use at AB_buff'Address;
begin
   data_valid = AB_var'valid;          -- returns false since the variable 
                                       -- contains extra bits
   ...     

これはすべて、以前の gnat バージョンでは機能しましたが、gnat 4.4.6 では機能しませんでした。gnat が Ada 仕様に準拠していることは理解しています。

上記の例の AB_var を強制的に 4 ビットにする方法はありますか? 「Object_Size を試しましたが、8 ビットの倍数である必要があります。

4

3 に答える 3

1

タイプ、特にレコードに追加します。私は最近、型に付加されていないと、レコード指定句でさえ機能しないというケースがありました。(アスペクト形式も使用できます。)Pragma Pack( [type_name] );pack

于 2013-05-08T20:04:00.370 に答える
1

変数に 4 ビットしか割り当てられない最新のコンピューター ハードウェアを私は知りません。最小値は 8 ビット バイトです。

悪気はありませんが、以前のバージョンの GNAT でもそれが可能だったのではないかと私は懐疑的です。

現在、rep 仕様または適切な規約プラグマが関連付けられているレコード内で、タイプ AB_Type の個々のフィールドにわずか 4 ビットを割り当てることができます。

しかし、離散変数としてではありません。

于 2013-05-08T18:27:37.397 に答える