【发布时间】:2012-03-07 18:54:21
【问题描述】:
在不同的过程调用之间是否保留了 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 Language Reference,在 ALLOCATE 变量之后,您不需要释放它(尽管这通常是一种好的做法),并且“所有受控存储都在程序结束时释放。”它并没有说存储在块的末尾被释放。 PL/I Programming Guide 在定位受控变量部分的使用 PLIDUMP 一章中提供了一些线索,但它不是确定的。它说定位受控变量的关键是找到它的锚。 NORENT WRITABLE 在静态存储中有一个锚。 NORENT NOWRITABLE(FWS) 有一个锚点自动存储的地址。 (有一个额外的间接级别。)使用 NORENT NOWRITABLE(PRV) 似乎有一个静态表,每个受控变量在私有表中都有一个偏移量。换句话说,根据处理选项,变量可能是可访问的,也可能不是。它没有说明使用 RENT 选项。 有什么想法吗?
【问题讨论】:
-
这更适合 Stack Overflow,因为它涵盖了特定的编码问题,而不是一般原则/架构。
-
原谅我的无知,但是这段代码是用什么语言编写的?我假设有些东西很老,但我不知道它是什么。
-
我会在 MAIN 过程中对计数器变量进行 DCL 和分配,然后在 PROC A 中进行递增。该变量将在范围内,并且在 MAIN 过程终止之前一直存在。