Avvio rapido |
Questa sezione riassume rapidamente i fondamenti per realizzare un programma Proteus; ulteriori informazioni sugli argomenti citati si trovano nelle successive sezioni.
A livello elementare, Proteus viene impiegato come processore di testo; questo significa che dovete avere un file di testo in un qualche formato (Dos, Macintosh, Unix) da convertire in qualche altro formato, o da cui volete estrarre informazioni.
Di norma, il vostro file consisterà in una serie di linee accomunate da alcune caratteristiche.
Considereremo in questo caso un esempio in cui ogni riga consiste in tre campi di lunghezza fissa:
cognome (30 caratteri) | nome (20 caratteri) | numero di telefono (12 caratteri) |
Per poter spiegare a Proteus come volete che il vostro file
dati sia elaborato dovete scrivere un programma.
Un programma Proteus è un file di testo, in qualunque formato,
contenente tutte le operazioni da effettuare su ciascuna riga.
Per scriverlo potete utilizzare un qualsiasi editor di testo o
anche un word processor, purché poi salviate il vostro lavoro in
formato testo (comunemente indicato anche come ASCII); si raccomanda di mantenere
l'estensione '.prt' ai file di programmi per
Proteus.
La sintassi di un programma è piuttosto elastica, nel senso che non vi sono particolari formalità da seguire per quanto riguarda spazi, indentazioni e maiuscole/minuscole.
Quando il programma viene eseguito, vi sono alcuni identificatori predefiniti fondamentali che assumono determinati valori in base ai dati in ingresso; due identificatori importanti sono L ed N.
L assume il valore dell'ultima riga letta dal file sorgente, mentre N indica il numero della riga corrispondente ad L nel medesimo file.
Supponiamo di voler estrarre dal nostro file di esempio tutti i cognomi (primo campo, di lunghezza fissa pari a 30 caratteri); un programma per fare questo è il seguente:
cCognome = LEFT(L, 30) PRINTLN cCognome
Analizziamolo in dettaglio.
La prima riga (o istruzione) è detta istruzione di assegnamento; essa
assegna all'identificatore cCognome
un determinato valore, che consiste nella parte a destra del
segno di uguale (tale simbolo può anche essere omesso, ma
consigliamo di mantenerlo per maggiore chiarezza). Ciò che si
trova a destra è detto espressione;
nella fattispecie, consiste nell'invocazione di una funzione di libreria predefinita di
Proteus (LEFT),
che estrae i primi n caratteri di una stringa, cioè la
sua parte sinistra (LEFT in inglese significa appunto sinistra).
Notiamo che per invocare questa funzione
non facciamo altro che scrivere il suo nome, seguito
immediatamente dalla parentesi tonda aperta, da alcuni dati
(detti parametri) separati da virgole (',') ed infine da una
parentesi tonda chiusa. Ogni funzione viene chiamata in questo
modo; il numero di parametri e la loro interpretazione dipendono
dalla funzione invocata. La funzione LEFT prende
per l'appunto due parametri: la stringa da elaborare ed il numero
di caratteri che ci interessano.
Il significato di questa istruzione è: assegna a cCognome
i primi 30 caratteri della stringa corrispondente
all'identificatore L. Come abbiamo visto, L è un identificatore
predefinito che assume come valore il contenuto dell'ultima riga
letta dal file in ingresso, pertanto per ogni riga che viene
letta questa istruzione estrae esattamente quanto cercato, cioé
il cognome. L'identificatore cCognome non è
predefinito; esso rappresenta un nome di variabile,
cioé un "contenitore" in cui possiamo memorizzare dati
di tipo stringa o numerici. Nel momento stesso in cui noi citiamo
un identificatore non predefinito, Proteus crea spazio per esso
ed imposta a "" (= 0 = 0.0) il suo valore;
successivamente, se ne modifichiamo il valore esso mantiene tale
valore finché non viene esplicitamente cambiato.
La seconda istruzione è l'istruzione di output fondamentale di Proteus; essa scrive sul file di uscita il valore dell'espressione che segue il nome del metodo (PRINTLN, in questo caso) e va a capo; i metodi sono strutture di controllo e particolari funzioni che non ritornano alcun valore; il loro numero è abbastanza esiguo, al contrario delle funzioni di libreria; PRINTLN è un metodo.
L'espressione passata a PRINTLN è l'identificatore cCognome, che abbiamo appena posto uguale al cognome per la riga corrente; ne risulta che, per ogni riga letta, queste due istruzioni comportano la scrittura sul file di uscita del cognome presente nel file dati. Poiché non vi sono altre istruzioni, subito dopo aver scritto il contenuto di cCognome Proteus legge un'altra riga dal file in ingresso e ripete dall'inizio il programma.
Quando non vi sono altre righe disponibili, Proteus arresta l'esecuzione, chiude tutti i file e restituisce il controllo all'utente.
Questo programma si può scrivere anche in maniera più compatta, così:
PRINTLN LEFT(L, 30)
In questo modo otteniamo maggiore efficienza in quanto evitiamo l'utilizzo di una variabile e usiamo una istruzione in meno, tuttavia il primo esempio è più chiaro; bisogna decidere caso per caso se è necessaria la massima chiarezza (ad esempio se il programma deve essere successivamente modificato da altre persone) oppure la massima efficienza (qualora il programma sia eseguito con grande frequenza).
Modifichiamo un po' il nostro esempio aggiungendo alcuni altri vincoli; ad esempio, supponiamo che il nostro file in ingresso abbia due righe di intestazione che devono essere ignorate. Possiamo utilizzare, a tal fine, il valore dell'identificatore predefinito N e la struttura di controllo condizionale di Proteus:
IF LE(N, 2) IGNORE FI PRINTLN LEFT(L, 30)
La struttura condizionale inizia con IF e termina con FI (che corrisponde a IF letto da destra verso sinistra); essa comporta l'esecuzione di tutte le istruzioni tra IF e FI (o ELSE) se il valore dell'espressione che compare dopo IF è diverso da 0, l'esecuzione delle istruzioni dopo ELSE (e prima di FI) in caso contrario e qualora vi sia un ramo ELSE. Altre strutture di controllo sono FOR, WHILE, SWITCH e REPEAT.
LE è anch'essa una funzione di libreria; essa prende due parametri e ritorna un valore diverso da 0 se il primo è minore o uguale (numericamente) al secondo, 0 in caso contrario. In Proteus, come in "C", 0 è equivalente a FALSO nei test, mentre un numero diverso da 0 è equivalente a VERO.
IGNORE è un
metodo molto particolare; esso indica a Proteus di terminare
l'esecuzione del programma per la linea corrente, di passare alla
riga successiva e ricominciare dall'inizio l'esecuzione del
programma.
Ciò è esattamente quello che vogliamo Proteus faccia per le
prime due righe di intestazione.
Quando Proteus ha letto la terza riga, N vale 3
e quindi le istruzioni dentro l'IF non saranno
più eseguite, mentre sarà eseguita la PRINTLN
che scriverà i cognomi come richiesto.
Complichiamo ancora il nostro esempio, supponendo che i campi non abbiano lunghezza fissa, bensì siano delimitati da virgole (',').
Delle stringhe di caratteri separate da uno o più caratteri presi da una certa lista sono dette token; nel nostro caso, dunque, ogni riga consiste in tre token delimitati da virgole.
Proteus dispone di molte funzioni di libreria per manipolare i token; nel nostro caso, utilizzeremo la funzione di tokenizzazione dinamica TOKEN, che prende tre parametri:
Il programma diventa:
IF LE(N, 2) IGNORE FI PRINTLN TOKEN(L, 1, ",")
Si noti che, qualora uno o più campi possano essere vuoti, è
necessario utilizzare la funzione VECSPLIT
invece delle funzioni tokenizzatrici; in caso contrario, si
correrebbe il rischio di considerare un campo al posto di un
altro.
Ad esempio, con i seguenti dati:
Rossi,Mario,555-443322 Bianchi,,555-667788
presumendo di voler prelevare il nome, il seguente codice è errato:
PRINTLN TOKEN(L, 2, ",")
Infatti, nel caso del signor Bianchi, per il quale non abbiamo il nome, questo codice restituirebbe il numero di telefono, "555-667788". Viceversa, il codice seguente è CORRETTO:
VH = VECSPLIT(L, ",") PRINTLN VECGET(VH, 2) VECFREE(VH)
Infatti VECSPLIT crea un vettore, contenente i vari campi determinati a partire dalla stringa, considerando anche eventuali campi vuoti (cioé due separatori consecutivi).
Tornando al nostro esempio iniziale, se vogliamo eliminare gli spazi eventualmente presenti a destra e a sinistra del cognome, possiamo utilizzare la funzione di libreria ALLTRIM (taglia a destra e sinistra) in questo modo:
IF LE(N, 2) IGNORE FI PRINTLN ALLTRIM(TOKEN(L, 1, ","), " ")
L'istruzione di scrittura ha ora una forma molto più complessa; come si vede, ogni parametro di funzione può essere a sua volta una funzione; ciò permette di ottenere espressioni compatte, evitando l'utilizzo di molte variabili inutili; inoltre, poichè Proteus non possiede operatori, l'ordine di esecuzione è implicitamente determinato e non sono richieste parentesi addizionali.
É anche possibile scrivere programmi che siano eseguiti una sola volta, senza file di ingresso e di uscita standard; si veda il parametro sulla linea di comando -z.
Ciò completa la nostra breve introduzione all'uso di Proteus; le sezioni successive specificano con maggiore dettaglio sintassi e semantica di tutti i metodi e delle funzioni di libreria, oltre a presentare alcuni argomenti avanzati come le funzioni definite dall'utente (UDF), il resto degli identificatori predefiniti e le espressioni regolari.
Inizio pagina | Prossimo argomento | Argomento precedente | Indice per argomenti | Indice analitico |