Сохраняется ли переменная z / OS PL / I CONTROLLED между отдельными вызовами процедуры? - PullRequest
2 голосов
/ 07 марта 2012

Сохраняется ли переменная z / OS PL / I CONTROLLED между отдельными вызовами процедуры?Давайте предположим, что нам нужен счетчик, который является внутренним для подпрограммы и сохраняется при вызовах.Самый простой способ сделать это - использовать статическую переменную, инициализируемую нулем и увеличивающуюся при каждой записи в подпрограмму.Но вы не можете сделать это, если программа должна быть реентерабельной.Поэтому вопрос в том, имеем ли мы доступ к контролируемой переменной, которая была выделена в предыдущем вызове.Будет ли работать следующий код?

PROC1: PROCEDURE OPTIONS(MAIN);
...
CALL A;
...
A: PROCEDURE;
DECLARE COUNT CONTROLLED ALIGNED FIXED BIN(15);
IF (ALLOCATION(COUNT) = 0)
    THEN ALLOCATE COUNT INIT(1);
    ELSE COUNT = COUNT + 1;
...
END A;

END PROC1;

Согласно справочнику по языку PL / I, после ВЫДЕЛЕНИЯ переменной, вам не нужно освобождать ее (хотя это обычно является хорошей практикой) и «Все контролируетсяпамять освобождается в конце программы ». Это не говорит о том, что память освобождается в конце блока.Руководство по программированию PL / I содержит некоторые подсказки в главе Использование PLIDUMP в разделе «Поиск контролируемых переменных», но оно не является окончательным.В нем говорится, что ключ к поиску контролируемой переменной - найти ее якорь.С NORENT WRITABLE есть якорь в статическом хранилище.С NORENT NOWRITABLE (FWS) есть адрес для автоматического хранения якоря.(Существует дополнительный уровень косвенности.) При использовании NORENT NOWRITABLE (PRV) создается статическая таблица со смещением в приватную таблицу для каждой контролируемой переменной.Другими словами, в зависимости от параметров обработки, возможно, переменная доступна, а может и нет.Это ничего не говорит об использовании опции RENT.Есть мысли?

1 Ответ

0 голосов
/ 27 марта 2012

В соответствии с опцией времени компиляции Руководства по программированию PL / I «АРЕНДА», ваш код «естественно возвращается», если он не изменяет ни одну из своих статических переменных.

Опция RENT указывает, что компилятор должен взять код, который не является естественно реентерабельным, и сделать его реентерабельным.

Таким образом, вы можете увеличивать переменную STATIC для каждой записи в подпрограмме, если программа скомпилирована с параметром RENT.

Пожалуйста, обратитесь по этой ссылке => Опция аренды из PL / I Руководство по программированию

Согласно «Структурному программированию PL / I» Дж. К. Хьюз, процедура REENTRANT может вызываться другими процедурами асинхронно. Например, задача B вызывает функцию SQRT. Пока эта функция находится в процессе вычисления квадратного корня, задача A (имеющая более высокий приоритет выполнения, чем задача B) должна получить контроль над системой и использовать функцию SQRT. Функция SQRT прерывается и промежуточные результаты для задачи B сохраняются; тогда задача A использует функцию SQRT. Когда задача A завершает свое выполнение, управление возвращается задаче B в том месте, где оно было прервано. Затем задача B завершает использование функции SQRT.

...