
MainframeSupports tip uge 8/2001:
For næsten to år siden (i uge 20/1999) skrev
jeg et tip om, hvordan man kan lave indkapsling i PL/1 ved hjælp af
STATIC-variable i en procedure. Jeg synes at tiden er kommet til at
afsløre, hvordan man laver det på en måde, der også fungerer i
reentrante programmer.
Jeg vil tage udgangspunkt i det oprindelige eksempel, som nu er rettet
til at benytte en såkaldt CONTROLLED variabel i stedet for en STATIC:
ooeksok: PROC(parameter) OPTIONS(MAIN);
CALL oo_procedure;
CALL oo_procedure;
CALL oo_procedure;
oo_procedure: PROC;
DCL allocation BUILTIN;
DCL kald_nr FIXED BIN(31) CONTROLLED;
IF allocation(kald_nr) = 0
THEN DO;
ALLOCATE kald_nr;
kald_nr = 0;
END;
kald_nr = kald_nr + 1;
IF kald_nr = 1
THEN
PUT SKIP LIST('Første kald');
ELSE
PUT SKIP LIST('Kald nr.' !! kald_nr);
END oo_procedure
END ooeksok;
I forhold til en STATIC variabel kræver en CONTROLLED variabel en lille
smule mere gymnastik, men det er til at leve med i forhold til udbyttet. Man
kan derudover en masse andre rigtig frække ting med CONTROLLED variable, men
det vil jeg komme tilbage til en anden gang.
En CONTROLLED variabel i PL/1 optager ingen plads før den bliver allokeret
med ALLOCATE. Hvis man laver en ALLOCATE mere af den samme CONTROLLED variabel,
så får man en ny variabel og den gamle er ikke tilgængelig længere.
Funktionen ALLOCATION vil returnere 2 for at angive, at variablen er allokeret to gange.
Hvis man laver en FREE af variablen, så vil den senest allokerede variabel
forsvinde og den tidligere allokerede være tilgængelig igen. Funktionen ALLOCATION
vil i dette tilfælde returnere 1. CONTROLLED variable kan altså bruges som en stak.
Hvis man laver FREE af en CONTROLLED variabel, der kun findes i et eksemplar,
så vil ALLOCATION igen returnere 0 og et forsøg på at bruge variablen vil
nu resultere i en PL/1 runtime fejl.
Forrige danske tip
Last tip in english
Tip oversigten
|