2

Adaで次のタスクを作成していますが、バッファーの数を通知するプロシージャを含める必要があります。どうやってやるの?

package body Buffer is

  task body Buffer is

    size: constant := 10000; -- buffer capacity
    buf: array(1.. size) of Types.Item;
    count: integer range 0..size := 0;
    in_index,out_index:integer range 1..size := 1;

  begin
    procedure getCount(currentCount: out Integer) is
    begin   
      currentCount := count;
    end getCount;   

    loop
      select
        when count<size =>
          accept put(item: in Types.Item) do
            buf(in_index) := item;
          end put;
          in_index := in_index mod size+1;
          count := count + 1;
        or
          when count>0 =>
            accept get(item:out Types.Item) do
              item := buf(out_index);
            end get;
            out_index := out_index mod size+1;
            count := count - 1;
        or
          terminate;
      end select;
    end loop;
  end Buffer;

end Buffer;

このコードをコンパイルすると、次のエラーが発生します

宣言は「開始」の前に行う必要があります

getCount手順の定義を参照してください。

4

2 に答える 2

6

差し迫った問題は、タスク本体処理されたステートメントのシーケンスで、対応するサブプログラム宣言を最初に指定せずに、サブプログラム本体 を指定したことです。ここに示すように、宣言型の部分に入れる必要があります。

より大きな問題は、保護されたタイプの方が適していると思われる制限付きバッファーの作成にあるようです。例は、§II.9保護されたタイプおよび§9.1保護されたタイプにあります。でprotected type Bounded_Buffer、を追加できます

function Get_Count return Integer;

このような体を持つ:

function Get_Count return Integer is
begin
   return Count;
end Get_Count;
于 2012-04-29T04:53:36.327 に答える
6

宣言は「begin」の前に行う必要があり、「getCount」の宣言は「begin」の後に続きます。それを再配置します:

procedure getCount(currentCount: out Integer) is
begin   
    currentCount := count;
end getCount;   

begin

しかし、実際には、trashgodのアドバイスに注意を払ってください。

于 2012-04-29T11:59:06.667 に答える