Сохраняется ли переменная 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.Есть мысли?