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