Создание процедуры или функции в задаче Ада

Я создаю следующую задачу на Аде и хочу, чтобы она содержала процедуру, которая сообщает мне количество моего буфера. Как я могу это сделать?

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;

Когда я компилирую этот код, я получаю сообщение об ошибке, которое

объявления должны предшествовать "begin"

ссылаясь на определение процедуры getCount.


person Madu    schedule 28.04.2012    source источник


Ответы (2)


Объявление должно предшествовать "begin", а ваше объявление "getCount" после "begin". Переместите его:

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

begin

Но на самом деле, обратите внимание на совет трэшгода.

person Marc C    schedule 29.04.2012
comment
+1 Хорошо подмечено. Удивительно, как улучшенное форматирование @Keith Thompson помогло мне это увидеть. - person trashgod; 29.04.2012

Непосредственная проблема заключается в том, что вы указали < em>тело подпрограммы без предварительного указания соответствующего объявление подпрограммы в части обрабатываемой последовательности операторов вашего тело задачи. Он должен находиться в декларативной части, как показано здесь.

Более серьезной проблемой является создание ограниченного буфера, для которого защищенный тип кажется более подходящим. Примеры можно найти в §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;
person trashgod    schedule 29.04.2012