
Ved Renden 31 2870 Dyssegaard Tel. +45 23 34 54 43
| 
MainframeSupports tip uge 1/2012:
En af de mest irriterende begrænsninger i PL/I er, at en tegnstreng kun kan være op til
32767 bytes lang. Det er jo ingenting i disse moderne tider, hvor stort set alle processorer
og operativsystemer adresserer med 64 bits. Indtil videre gider IBM åbenbart ikke gøre noget
ved denne begrænsning, så her kommer et tip om, hvordan du omgår denne begrænsning.
Jeg vil gerne lave en CHAR(100000) variabel i mit program. Det kan jeg jo desværre ikke,
så i stedet kan jeg erklære den som et array med 100000 elementer, hvor hvert enkelt element
er en CHAR(1). Ulempen er selvfølgelig, at jeg så ikke umiddelbart har adgang til funktioner
som for eksempel SUBSTR, der arbejder på en almindelig CHAR-variabel. Men det problem har
PL/I folkene for længst løst med STRING funktionen. Her kommer et eksempel:
DCL myBigChar(100000) CHAR(1);
DCL charPos FIXED BIN(31);
string(myBigChar) = 'The first small portion of a huge CHAR variable';
myBigChar(60000) = '*';
charPos = index(string(myBigChar), '*');
PUT SKIP LIST('* found in pos. ' !! charPos);
PUT SKIP LIST(substr(string(myBigChar), 11, 5));
Det først assignment statement fungerer præcis som hvis myBigChar var erklæret som en
CHAR(100) eller lignende. Alle de efterfølgende bytes bliver med andre ord sat til blanke.
Det andet assignment udnytter, at myBigChar faktisk er et array og sætter pos. 60000 til
en asteriks. Med den efterfølgende index finder vi asteriksens position. Her vil du
med stor sandsynlighed få et andet resultat end det forventede 60000 for at få det rigtige
resultat, da du skal kompilere
programmet med compiler option BIFPREC(31). Brug PROCESS til dette.
Den sidste PUT SKIP LIST vil udskrive teksten small.
Som du kan se er tricket at benytte string(myBigChar) de steder, hvor du normalt bare
ville skrive myBigChar. Desværre virker tricket ikke hvis du forsøger at benytte substr
som pseudovariable. Concateneringer ud over de første 32767 tegn virker heller ikke, så
der er stadig plads til forbedringer.
Forrige danske tip
Last tip in english
Tip oversigten
|