In questa sezione: |
È possibile scrivere una subroutine in qualsiasi linguaggio che supporti le subroutine. Se si intende rendere una subroutine disponibile ad altri utenti, assicurarsi di documentare le prestazioni della propria subroutine, che argomenti include, che tipo di formato si tratta e in che ordine deve apparire nella chiamata della suboroutine.
Quando si scrive una subroutine, è necessario considerare i requisiti ed i limiti che la influenzano. Esse sono:
Se si scrive un programma chiamato INTCOMP, che calcola la quantità di denaro in un account che matura un interesse semplice, il programma legge un record, verifica se i dati sono accettabili e quindi chiama una subroutine chiamata SIMPLE, che calcola la quantità di denaro. Il programma e la subroutine sono memorizzati insieme nello stesso file.
Il programma e la subroutine visualizzati qui sono scritti in pseudocodice (un metodo di rappresentazione del codice computer in modo generale):
Begin program INTCOMP. Execute this loop until end-of-file. Read next record, fields: PRINCPAL, DATE_PUT, YRRATE. If PRINCPAL is negative or greater than 100,000, reject record. If DATE_PUT is before January 1, 1975, reject record. If YRRATE is negative or greater than 20%, reject record. Call subroutine SIMPLE (PRINCPAL, DATE_PUT, YRRATE, TOTAL). Print PRINCPAL, YEARRATE, TOTAL. End of loop. End of program.
Subroutine SIMPLE (AMOUNT, DATE, RATE, RESULT). Retrieve today's date from the system. Let NO_DAYS = Days from DATE until today's date. Let DAY_RATE = RATE / 365 days in a year. Let RESULT = AMOUNT * (NO_DAYS * DAY_RATE + 1). End of subroutine.
Se si sposta la subroutine SIMPLE in un file separato dal programma principale e la si compila, è possibile chiamata la subroutine. La seguente richiesta di prospetto mostra la quantità di denaro che i dipendenti guadagnerebbero, se investissero i propri stipendi in account con retribuzioni pari al 12%:
TABLE FILE EMPLOYEE PRINT LAST_NAME DAT_INC SALARY AND COMPUTE INVESTED/D10.2 = SIMPLE(SALARY, DAT_INC, 0.12, INVESTED); BY EMP_ID END
Nota: La subroutine è progettata per restituire solo la quantità dell'investimento, non la data corrente, poiché una subroutine è solo in grado di restituire un singolo valore ogni volta che si chiama.
Il nome della subroutine può essere lungo fino ad otto caratteri, a meno che il linguaggio in uso per scrivere la subroutine non richieda un nome più breve. Il nome deve cominciare con una lettera e può consistere in una combinazione di lettere e/o numeri. I simboli speciali non sono consentiti.
Quando si creano argomenti per una subroutine, è necessario considerare i seguenti problemi:
Non si dovrebbe assumere che i parametri di immissione siano memorizzati in memoria contigua.
Le lunghezze della chiamata di argomenti, come definito in WebFOCUS devono corrispondere alle lunghezze degli argomenti corrispondenti, definiti nella subroutine.
Qualsiasi deviazione da queste regole potrebbe risultare in problemi nell'uso della subroutine. Information Builders consiglia di modificare la subroutine per essere conformi alle regole definite e quindi collegarla sopra la linea. Per poter caricare le subroutine sopra la linea, le seguenti sono le opzioni di modifica collegamenti richiesti per la compilazione e la memorizzazione della subroutine:
Quando si scrive una subroutine, è necessario considerare i seguenti problemi di linguaggio:
Linguaggio e memoria. Se si scrive una subroutine in un linguaggio che trasferisce le librerie in memoria (per esempio, FORTRAN e COBOL), le libreria riducono la quantità di memoria disponibile per la subroutine.
FORTRAN. TSO supporta le operazione di immissione/emissione FORTRAN.
COBOL. Quando si scrive una subroutine in COBOL:
Formato FOCUS |
Immagine |
---|---|
An
|
Xn
|
I |
S9(9) COMP |
P |
S9(n)[V9(m)] dove: (1+n+m)/2 = 8 per numeri compressi di piccole dimensioni. (1+n+m)/2 = 16 per numeri compressi di grandi dimensioni. |
D |
COMP-2 |
F |
COMP-1 |
PL/I. Quando si scrive una subroutine in PL/I:
OPTIONS (COBOL)
CHARACTER (n)
dove:
La lunghezza del campo come definita dalla richiesta. Non usare l'attributo VARYING.
DECIMAL FLOAT (16)
oppure
BINARY FLOAT (53)
Formato FOCUS |
Dichiarazione PL/I per Emissione |
---|---|
An
|
CHARACTER (n)
|
I |
BINARY FIXED (31) |
F |
DECIMAL FLOAT (6) or BINARY FLOAT (21) |
D |
DECIMAL FLOAT (16) or BINARY FLOAT (53) |
P |
DECIMAL FIXED (15) (per numeri compressi di piccole dimensioni, 8 byte) DECIMAL FIXED (31) (pre numeri compressi di grandi dimensioni, 16 byte) |
Linguaggio C. Quando si scrive una subroutine in C:
Formato FOCUS |
Dichiarazione C per Emissione |
---|---|
An
|
char *xxx n
I campi alfanumerici non vengono terminati con un byte nullo e non possono essere elaborati dalla maggior parte delle subroutine di manipolazione stringhe nella libreria run-time. |
I |
long *xxx
|
F |
float *xxx
|
D |
double *xxx
|
P |
Non equivalente in C. |
In questa sezione: |
Considerare il seguente quando si pianificano i requisiti di programmazione:
È possibile aggiungere flessibilità alla propria subroutine, usando una tecnica di programmazione. La tecnica di programmazione può essere una delle seguenti:
Una subroutine è di solito eseguita iniziando dalla prima dichiarazione. Tuttavia, è possibile eseguire una subroutine iniziando da qualsiasi posto nel codice designato come punto di entrata. Questa azione consente ad una subroutine di usare un algoritmo di base per produrre risultati diversi. Per esempio, la subroutine calcola il giorno della settimana in cui si trova la data. Specificando il nome della subroutine DOWK, si ottiene una abbreviazione di 3 lettere del giorno. Se si specifica il nome di entrata DOWKL, si ottiene il nome completo. Il calcolo, comunque, è lo stesso.
Ogni punto di entrata ha un nome. Per eseguire una subroutine ad un punto di entrata, specificare il nome del punto di entrata nella chiamata alla subroutine, invece del nome della subroutine. La designazione di un punto di entrata dipende dal linguaggio che si sta usando.
{subroutine|entrypoint} (input1, input2,...outfield)
dove:
Nome della subroutine.
Il nome del punto di entrata in cui eseguire la subroutine.
Gli argomenti della subroutine.
Il campo che contiene il risultato o formato del valore di emissione racchiuso tra virgolette singole.
In Dialogue Manager, è necessario specificare il formato. In Maintain, è necessario specificare il nome del campo.
La subroutine FTOC, scritta in pseudocodice di seguito, converte la temperatura da Fahreneheit in Centigradi. Il punto di entrata FTOK (designato dal comando Entrata) imposta un flag che comporta la sottrazione di 273 dalla temperatura in centigradi, per trovare la temperatura Kelvin. La subroutine è:
Subroutine FTOC (FAREN, CENTI). Let FLAG = 0. Go to label X. Entry FTOK (FAREN, CENTI). Let FLAG = 1. Label X. Let CENTI = (5/9) * (FAREN - 32). If FLAG = 1 then CENTI = CENTI - 273. Return. End of subroutine.
Il seguente è un modo più breve per scrivere la subroutine. Notare che l'argomento di emissione kelv, elencato per il punto di entrata, è diverso dall'argomento di emissione centi, elencato all'inizio della subroutine:
Subroutine FTOC (FAREN, CENTI). Entry FTOK (FAREN, KELV). Let CENTI = (5/9) * (FAREN - 32). KELV = CENTI - 273. Return. End of Subroutine.
Per ottenere la temperatura in centigradi, specificare il nome di subroutine FTOC nella chiamata della subroutine. La subroutine elabora come segue:
CENTIGRADE/D6.2 = FTOC (TEMPERATURE, CENTIGRADE);
Per ottenere la temperatura Kelvin, specificare il nome di entrata FTOK nella chiamata della subroutine. La subroutine elabora come segue:
KELVIN/D6.2 = FTOK (TEMPERATURE, KELVIN);
Una subroutine è in grado di specificare massimo 200 argomenti, incluso l'argomento di emissione. Per elaborare più di 200 argomenti, la subroutine deve specificare due o più dichiarazioni di chiamate, per inoltrare gli argomenti alla subroutine.
Usare la seguente tecnica per scrivere una subroutine con più chiamate:
L'elenco degli argomenti all'inizio della propria subroutine deve rappresentare lo stesso numero di argomenti nella chiamata alla subroutine, incluso l'argomento del numero di chiamata e l'argomento di emissione.
Ogni chiamata contiene lo stesso numero di argomenti. Questo avviene poiché l'elenco degli argomenti in ogni chiamata corrisponde all'elenco degli argomenti all'inizio della subroutine. Si potrebbe dover elaborare alcuni argomenti come argomenti fittizi, se si ha un numero uguale di argomenti. Per esempio, se si dividono 32 argomenti in sei segmenti, ogni segmento elabora sei argomenti; il sesto argomento elabora due argomenti e quattro argomenti fittizi.
Le subroutine potrebbero dover richiedere ulteriori argomenti come determinato dal programmatore che crea la subroutine.
Terminare ogni segmento con un commando che restituisca il controllo alla richiesta (comando RETURN).
È inoltre possibile usare la tecnica del punto di entrata per scrivere subroutine che elaborano più di 200 argomenti. Per dettagli, consultare Esecuzione di una subroutine in un punto di entrata.
field = subroutine (1, group1, field) ;field = subroutine (2, group2, field); . . .outfield = subroutine (n, groupn, outfield);
dove:
Nome del campo che contiene il risultato del segmento, o il formato del campo racchiuso tra virgolette singole. Questo campo deve avere lo stesso formato di outfield.
Non specificare campo per l'ultima dichiarazione di chiamata; usare outfield.
Il nome della subroutine lunga fino a otto caratteri.
Il numero che identifica ogni chiamata alla subroutine. Questo numero deve essere il primo argomento in ogni chiamata alla subroutine. La subroutine usa questo numero di chiamata per diramare i segmenti del codice.
Questi elementi sono gli argomenti di immissione inoltrati da ogni chiamata della subroutine. Ogni gruppo contiene lo stesso numero di argomenti e non più di 26 argomenti l'uno.
Il gruppo finale potrebbe contenere argomenti fittizi.
Il campo che contiene il risultato o formato del valore di emissione racchiuso tra virgolette singole.
In Dialogue Manager, è necessario specificare il formato. In Maintain, è necessario specificare il nome del campo.
La subroutine ADD32, scritta in pseudocodice, somma 32 numeri. Si divide in sei segmenti, ognuno dei quali aggiunge sei numeri da una chiamata alla subroutine. (Il numero totale di argomenti di immissione è 36, ma gli ultimi quattro sono argomenti fittizi.) Il sesto argomento aggiunge due argomenti alla variabile SUM e restituisce il risultato. Il sesto argomento non elabora ogni valore fornito per i quattro argomenti fittizi.
La subroutine è:
Subroutine ADD32 (NUM, A, B, C, D, E, F, TOTAL). If NUM is 1 then goto label ONE else if NUM is 2 then goto label TWO else if NUM is 3 then goto label THREE else if NUM is 4 then goto label FOUR else if NUM is 5 then goto label FIVE else goto label SIX. Label ONE. Let SUM = A + B + C + D + E + F. Return. Label TWO Let SUM = SUM + A + B + C + D + E + F Return Label THREE Let SUM = SUM + A + B + C + D + E + F Return Label FOUR Let SUM = SUM + A + B + C + D + E + F Return Label FIVE Let SUM = SUM + A + B + C + D + E + F Return Label SIX LET TOTAL = SUM + A + B Return End of subroutine
Per usare la subroutine ADD32, elencare tutte le sei dichiarazioni di chiamata, ogni chiamata specificando sei numeri. Gli ultimi quattro numeri, rappresentati da zero, sono argomenti fittizi. Il comando DEFINE memorizza il totale dei 32 numeri nel campo SUM32.
DEFINE FILE EMPLOYEE DUMMY/D10 = ADD32 (1, 5, 7, 13, 9, 4, 2, DUMMY); DUMMY/D10 = ADD32 (2, 5, 16, 2, 9, 28, 3, DUMMY); DUMMY/D10 = ADD32 (3, 17, 12, 8, 4, 29, 6, DUMMY); DUMMY/D10 = ADD32 (4, 28, 3, 22, 7, 18, 1, DUMMY); DUMMY/D10 = ADD32 (5, 8, 19, 7, 25, 15, 4, DUMMY); SUM32/D10 = ADD32 (6, 3, 27, 0, 0, 0, 0, SUM32); END
WebFOCUS |