1

一般的なレコードの定義に問題があります。

-- ADS File
package Stack is

    -- (generic) Entry
    generic type StackEntry is private;

    -- An array of Entries (limited to 5 for testing)
    type StackEntryHolder is array (0..5) of StackEntry;

    -- Stack type containing the entries, it's max. size and the current position
    type StatStack is
    record                                  -- 1 --
        maxSize : Integer := 5;             -- max size (see above)
        pos : Integer := 0;                 -- current position
        content : StackEntryHolder;         -- content entries
    end record;


    -- functions / procedures

end Stack;

これをコンパイルすると、次のエラーが発生します(で-- 1 --):

ジェネリック型の定義ではレコードは許可されていません

4

3 に答える 3

4

プライベートタイプのStatStackとその操作を提供する汎用パッケージを作成したいと思います。

于 2012-11-18T14:55:02.220 に答える
3

私はあなたがこのような何かを探していると思います:

generic 
   type StackEntry is private;
package Stack_G is

   type ReturnCode is (Ok,Stack_Full,Stack_Empty);

   -- functions / procedures
   procedure Push (E  : in     StackEntry;
               RC :    out ReturnCode);
   procedure Pop (E  : out StackEntry;
              RC : out ReturnCode);
private
   -- An array of Entries (limited to 5 for testing)
   type StackIndex is new Integer range 1 .. 5;
   type StackEntryHolder is array (StackIndex) of StackEntry;

   -- Stack type containing the entries, it's max. size and the current position
   type StatStack is record 
      IsEmpty : Boolean := True;
      Pos : StackIndex := StackIndex'First;-- current position
      Content : StackEntryHolder;          -- content entries
   end record;

end Stack_G;
  1. maxSizeは必要ありません。これは、配列属性'lengthまたはスタックインデックスタイプ'lastから取得できます。
  2. stackの名前をstack_gに変更しました(汎用パッケージであることを示すための命名規則)
  3. StackEntryはジェネリックのパラメーターであり、スタックパッケージをインスタンス化するときにこれを使用する必要があります。
  4. スタックインデックスタイプを追加しました。Adaで新しいタイプとサブタイプを使用する習慣を身に付けると、後で何時間も節約できます。
于 2012-11-18T21:23:10.127 に答える
3

これは、作成したコードが一般的な宣言の適切な構文に従っていないためです。これは、LRMでその輝かしいBNF形式で表示できます。

基本的に、ジェネリックパッケージとジェネリックルーチンのどちらを宣言するかを決定する必要があります。単一のサブルーチンジェネリック以上のものが必要だと仮定すると、パッケージが必要だと思います。次のようになります。

generic{一般的な正式なもの}{パッケージ宣言}

...ここで、「{packagedeclaration}」は通常のパッケージのデカレーション(ただし、一般的な正式な部分で宣言されたものを使用する可能性があります)であり、「{genericformalstuff}」は一般的な「正式な」パラメータの一連のデカレーションです。クライアントがジェネリックに渡すこと。

あなたのコードで起こったことは、コンパイラーが魔法の言葉genericを見て、次のサブプログラムまたはパッケージの削除が一般的な仮パラメーターになるまですべてを期待しているということです。それが最初に見つけたもの、同じ行のプライベートタイプのdelcarationは問題ありません。ただし、次の行には完全なレコード宣言が含まれているため、一般的な仮パラメーターのようには見えません。そのため、コンパイラは混乱し、エラーを吐き出しました。

于 2012-11-19T15:17:51.597 に答える