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

声明必须在“开始”之前,并且您的“getCount”声明“开始”之后。重新定位它:

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

begin

但说真的,请注意垃圾神的建议。

于 2012-04-29T11:59:06.667 回答
6

直接的问题是您指定了一个子程序主体 ,而没有首先任务主体的已处理语句序列部分中指定相应的子程序声明。它应该放在声明部分,如此所示。

更大的问题似乎是创建有界缓冲区,受保护的类型似乎更适合。示例可以在§II.9 Protected Types§9.1 Protected Types中找到。在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 回答