Scrittura di una subroutine

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.


Inizio pagina

x
Denominazione di una Subroutine

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.


Inizio pagina

x
Creazione di Argomenti

Quando si creano argomenti per una subroutine, è necessario considerare i seguenti problemi:

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:


Inizio pagina

x
Considerazione di Linguaggio

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:

PL/I. Quando si scrive una subroutine in PL/I:

Linguaggio C. Quando si scrive una subroutine in C:



x
Programmazione di una Subroutine

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:



x
Esecuzione di una subroutine in un punto di entrata

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.



x
Sintassi: Come eseguire una subroutine in un punto di entrata
{subroutine|entrypoint}  (input1, input2,...outfield)

dove:

subroutine

Nome della subroutine.

entrypoint

Il nome del punto di entrata in cui eseguire la subroutine.

input1, input2,...

Gli argomenti della subroutine.

outfield

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.



Esempio: Esecuzione di una subroutine in un punto di entrata

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);


x
Inclusione di più di 200 argomenti in una chiamata della subroutine

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:

  1. Dividere la subroutine in segmenti. Ogni segmento riceve gli argomenti, inoltrato da una chiamata alla subroutine corrispondente.

    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.

  2. Includere una istruzione all'inizio della subroutine in grado di leggere il numero di chiamata (primo argomento) e di diramare al segmento corrispondente. Ogni segmento elabora gli argomenti da una chiamata. Per esempio, numero uno si dirama al primo segmento, numero due si dirama al secondo segmento e così via.
  3. Far memorizzare ad ogni segmento l'argomento ricevuto in altre variabili (da poter far elaborare dall'ultimo argomento) o accumularli in un totale progressivo.

    Terminare ogni segmento con un commando che restituisca il controllo alla richiesta (comando RETURN).

  4. L'ultimo argomento restituisce il valore di emissione finale alla richiesta.

È 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.



x
Sintassi: Come creare uan subroutine con più dichiarazioni di chiamate
								field = subroutine (1, group1, field)
;field = subroutine (2, group2, field);
   .
   .
   .outfield = subroutine (n, groupn, outfield);

dove:

campo

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.

subroutine

Il nome della subroutine lunga fino a otto caratteri.

n

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.

group1, group2,...

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.

outfield

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.



Esempio: Creazione di una subroutine divisa in segmenti

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