|
Standaard Invoer/Uitvoer
De REXXUTIL library
Bestudeer het programma INVUITV.rex voor een voorbeeld van standaard
Invoer/Uitvoer. Standaard Invoer/Uitvoer refereert aan die gevallen
waarbij gegevens worden gelezen van het toetsenbord of geschreven naar
het beeldscherm. Omdat dit zo vaak voorkomt, zijn deze randapparaten
impliciet aanwezig en hoeven zij niet te worden benoemd in
Invoer/Uitvoer opdrachten. Een voorbeeld zal dit duidelijk maken.
/* REXX */
Call RxFuncAdd 'SysGetKey', 'RexxUtil', 'SysGetKey'
Say
Say 'Tik een letter in (X stopt het programma):'
Do Until (KEY = 'x' | KEY = 'X')
KEY = SysGetKey('NOECHO')
Call CharOut,KEY
End
Call RxFuncDrop 'SysGetKey'
Say
Say 'Einde programma.'
Exit 0
Het eerste wat opvalt is de eerste regel van het programma met als
tekst Call RxFuncAdd 'SysGetKey'.... Deze lijkt wel een beetje
op de Call die we reeds bestudeerd hebben. Met deze opdracht
wordt op de schijf naar een Windows DLL gezocht en, indien gevonden,
ingelezen. Het systeem gaat op zoek naar een bestand met de naam
REXXUTIL.dll en leest de inhoud ervan op de plaats van het
statement. Het zal duidelijk zijn dat REXXUTIL de SysGetKey
functie moet bevatten, die deel van het programma uit gaat maken.
Het REXXUTIL.dll bestand wordt geleverd met de
interpreter en bevat een hoeveelheid functies die de mogelijkheden
van de interpreter uitbreiden. REXX is dus uitbreidbaar!
Dit bestand wordt een DLL genoemd en je zult een
aantal van dit soort bestanden vinden in de subdirectories die
behoren bij de interpreter. Elke DLL heeft een specifieke toepassing
en je kunt er een of meerdere toevoegen aan je programma.
De REXX interpreter zal het bestand zoeken in de current
subdirectory. Indien niet gevonden, dan wordt wordt het pad
afgezocht, aangegeven door middel van het MS-DOS PATH commando.
Invoer/Uitvoer operaties in REXX
In de programmeertaal REXX maken Invoer- en Uitvoer functies geen deel uit
van de taal. Ze moeten door de gebruiker zelf worden gedefinieerd. Om
niet iedereen het wiel opnieuw uit te laten vinden, hebben de
schrijvers van de REXX interpreter al het een en ander gedaan. Verschillende
Invoer- en Uitvoer functies worden derhalve bij de interpreter geleverd,
via een functie bibliotheek, en kunnen direct worden toegepast bij het
schrijven van je programma's. Veel fabrikanten van interpreters hanteren
voor deze functies dezelfde namen, waardoor ze een soort standaard zijn
geworden. Ook plaats en datatype van de functie parameters zijn zeer
consistent. Programma's zijn daardoor overdraagbaar naar een interpreter
op een ander platform.
Trek eens wat extra tijd uit en bestudeer de inhoud van het
help bestand. Er zullen beslist zaken zijn die je nog
niet begrijpt, maar veel zul je herkennen en je kunt er bijzonder veel
van leren. Dit bestand beschrijft de In- en Uitvoer functies
in de vorm van help-schermen.
Kijk weer naar het voorbeeld programma. Er wordt een character
variabele gedeclareerd en een boodschap afgedrukt middels
Say. Dan wordt een eindeloze lus gestart, die eindigt
zodra we de letter x (of X) intoetsen.
Als je niet meer weet hoe iteraties werken, kijk dan nog eens naar
Hoofdstuk 3, "Programma besturing". Twee nieuwe functies worden
geïntroduceerd, een om een teken van het toetsenbord te lezen
en een om een teken af te drukken.
De functie SysGetKey() leest een enkel teken van het standaard
invoer apparaat, het toetsenbord, en kent dat toe aan de variabele
KEY. De functie CharOut gebruikt het
standaard uitvoer apparaat, het scherm, en drukt de letter die in
KEY is opgeslagen af. De lus blijft letters lezen en
afdrukken totdat we een kleine- of hoofdletter x intikken.
Het inlezen van getallen
Bestudeer nu het programma GETALIN.rex. Het programma is vrijwel identiek
aan het vorige. Dit programma werkt met een integer en eindigt wanneer
de integer de waarde 100 krijgt.
/* REXX */
Say
Say 'Tik een getal in (100 stopt het programma):'
Do Until (GETAL = 100)
Pull GETAL . /* Lees een getal in */
Say 'Het getal is 'GETAL /* en druk hem af ... */
End
Say
Say 'Einde programma.'
Exit 0
In plaats van teken voor teken lezen we hier een getalswaarde in.
Dit doen we met behulp van de functie Pull. Deze functie is
het broertje van Say en is een Invoer functie in plaats
van een Uitvoer functie.
Er wordt een complete regel gelezen, d.w.z. alle tekens die werden
ingetikt tot aan de ENTER toets. Het toetsenbord buffer
geldt als invoer en wordt doorzocht. Elke aaneengesloten serie cijfers
wordt als getal gezien, hetgeen betekent dat er tevens een conversie
plaatsvindt van tekst naar numeriek. Wanneer je meerdere getallen op
een regel tegelijk intikt (gescheiden door een spatie), zal de punt
(.) in de Pull instructie ervoor zorgen dat alleen het eerste getal
netjes wordt geconverteerd en afgedrukt. De rest wordt genegeerd.
Het getal 100 laat het programma eindigen. Wanneer het getal 100 ergens
in het midden van een serie getallen werd ingetikt, zal het eerste
getal worden afgedrukt. De rest wordt niet meer verwerkt.
Denk eraan dat het getal dat wordt ingetikt binnen het waardebereik van
de integer moet liggen. Dit is machine afhankelijk. Vroeger was een
integer altijd 16 bits. Met de komst van Intel 386 en 486 processoren
is dat 32 bits geworden. Het is de verantwoordelijkheid van de REXX
programmeur te bewaken dat ingevoerde gegevens in dit waardebereik
liggen. Compileer en test nu het programma. Probeer het waardebereik
uit.
Het inlezen van teksten
Bestudeer het programma TEKSTIN.rex. Dit programma leest een tekst in. /*
REXX */ Say Say 'Tik een tekst in, niet meer dan 80 tekens.' Say 'Als de
eerste letter een X is, stopt het programma.' Do Until (Left(TEKST,1) =
'x' | Left(TEKST,1) = 'X') Pull TEKST /* Lees een tekst in */ Say 'De tekst
is "'TEKST'"' /* en druk hem af ... */ End Say Say 'Einde programma.' Exit
0 Wellicht werd je verrast door hetgeen werd afgedrukt. De regel
tekst die je intikte, werd precies zo afgedrukt. Het programma eindigt zodra
het de letter x op de eerste positie vindt. Door de itererende
werking zal het programma stoppen bij het eerste woord op de regel dat met
een x begint.
Probeer ook eens meer dan 80 tekens in te voeren. Het hangt van je
computersysteem af wat er gebeurt. In de meeste gevallen zal het gewoon
goed gaan. Teksten kunnen erg lang worden in een REXX programma.
|