Ада запись и когда использование заявления - PullRequest
8 голосов
/ 31 января 2011

Я новичок в языке программирования Ada и работаю над параллельным программированием, но у меня проблема с одной реализацией.Это может быть очень глупый вопрос.Код такой:

type status is array(1..6) of boolean; --boolean values for each track
track_available :status:=(others=>true); --true if track is available
protected track_handler is

entry track_req(n:in track_part_type); --n is track number
entry track_rel(n:in track_part_type); --n is track number

end track_handler;


protected body track_handler is
--implement entries
entry track_req(n: in track_part_type) when track_available(n) is --here where the error occurs
    begin
        req(n);
    end track_req;

entry track_rel(n: in track_part_type) when track_available(n) is
    begin
        rel(n);
    end track_rel;
end track_handler;

    procedure req(nr : track_part_type) is
    begin
        --null;
        track_available(nr):=false;
    end req;

    procedure rel(nr : track_part_type) is
    begin
        --null;
        track_available(nr):=true;
    end rel;

Здесь я получаю ошибку компиляции для оператора «when track_available (n)», который говорит, что «n не определено»Я думаю, что переменная n находится вне области видимости, но мне также нужно проверить, является ли n-й индекс массива истинным или ложным.Как я могу преодолеть эту проблему?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 31 января 2011

Вы не можете использовать параметры записи в своей собственной защите.Я так понял, что вы получили

Как работают охранники, все они оцениваются до того, как начинается ожидание , и только те , которые активны в это время будет доступно.Они не получают периодическую переоценку или динамическое чтение или что-то в этом роде.

Это означает, что будет трудно правильно настроить логику для ваших охранников, если вы не напишите свой код, чтобы только другие записи вваш защищенный объект изменяет охрану .Если вы хотите использовать некоторые данные извне защищенного объекта для управления его поведением, вам, вероятно, потребуется использовать какой-то механизм, отличный от охранников, для этого.Например, проверка прямо внутри входа и немедленный выход или что-то в этом роде.

Существует одна возможность того, что вы пытаетесь сделать: Ввод семейства .Вы должны быть в состоянии использовать индекс входной семьи в охране.

Спецификация изменится на:

entry track_req(track_part_type); 
entry track_rel(track_part_type); 

И тело изменится на

entry track_req(for n in track_part_type) when track_available(n) is 
    begin
        req(n);
    end track_req;

entry track_rel(for n in track_part_type) when track_available(n) is
    begin
        rel(n);
    end track_rel;
end track_handler;
1 голос
/ 31 января 2011

В приведенном ниже коде вы пытаетесь использовать track_available (n), прежде чем он будет полностью определен (n: в track_part_type).

entry track_req(n: in track_part_type) when track_available(n) is 

См. Также http://en.wikibooks.org/wiki/Ada_Programming/Tasking#Protected_types

NWS

...