Jaap's Psion II Page

This is the Italian translation of the Psion LZ/LZ64 Programming manual. It is also available in French.


ORGANISER II
Manuale di programmazione
Modelli LZ e LZ64



© Psion PLC 1989

Tutti i diritti riservati. Il presente documento unitamente a tutti i programmi inseriti sono copyright della Psion PLC, Londra Regno Unito.

È vietata la riproduzione totale o parziale, incluso l'utilizzo con macchine atto a riprodurlo, senza l'espressa autorizzazione della Psion PLC. È anche vietata la riproduzione contraria.

Le informazioni inserite sono soggette a cambiamenti senza preavviso.

Psion e logo Psion sono marchi registrati della Psion PLC.
Psion Organiser II, Datapak e Rampak sono marchi registrati Psion PLC.
Lotus e 1-2-3 sono marchi registrati Lotus Development Corporation.

I prodotti Psion sono distribuiti in Italia da:

PSICOM s.r.l.
Via Don Sturzo 24
20020 LAINATE (MI)
P.O. BOX 117
tel. 02/93570153 r.a.



PART NO. 6100-0083
V1 AUG 89



Indice dei contenuti

1 INTRODUZIONE ALL'OPL IL MENU PROG CREARE, SALVARE E MANDARE IN ESECUZIONE UNA PROCEDURA EDITA, STAMPA, LISTA. COPIA, CANCEL 2 PROCEDURE E VARIABILI 1 I NOMI DELLE PROCEDURE 2 DICHIARAZIONE DELLE VARIABILI 3 OPERAZIONI SULLE VARIABILI 4 COMUNICAZIONE DI VARIABILI 3 CICLI E SALTI BREAK 4 GLI OPERATORI 5 LA GESTIONE DEI FILE DATI AGGIUNGERE UN RECORD AD UN FILE CAMBIARE IL RECORD CORRENTE APERTURA DI UN FILE CAMBIARE IL FILE CORRENTE 6 GESTIONE DEI FILE DI VARIO TIPO 7 LA GESTIONE DEGLI ERRORI GLI ERRORI PIÙ COMUNI ERRORI IN FASE DI ESECUZIONE INTRAPPOLAMENTO DEGLI ERRORI 8 PROGRAMMI ESEMPIO 1 GIORNI (VERSIONE 1) 2 GIORNI (VERSIONE 2) 3 DADI 4 MUTUO 5 IL GIOCO DELLA CACCIA 6 PROCEDURE DI GESTIONE DI FILE DATI 7 TELEFONO (GESTIONE DEI FILE DATI) 8 PROCEDURA DI GESTIONE DEL FILE AGENDA 9 COMANDI E FUNZIONI DELL'OPL SOMMARIO SINTASSI DEI COMANDI SINTASSI DELLE FUNZIONI ELENCO DEI COMANDI E DELLE FUNZIONI

APPENDICI: A IL SET DI CARATTERI DELL'ORGANISER STAMPARE CARATTERI CHE NON APPAION SULLA TASTIERA ACCEDERE AI VALORI ASCII NELLE PROCEDURE CODICI PER TASTI SPECIALI I CARATTERI DI CONTROLLO CARATTERI DEFINITI DALL'UTENTE B DATI TECNICI C PROGRAMMAZIONE TECNICA Indirizzi della memoria D MESSAGGI DI ERRORE


1 INTRODUZIONE ALL'OPL

OPL l'acronimo di Organiser Programming Language. Esso fornisce un insieme di comandi e di funzioni adatti per ogni genere di applicazioni, incluse la manipolazione del records di files di dati.

Per entrare in OPL:

Operando dal menu Prog è possibile sia iniziare programmi nuovi che proseguire con programmi vecchi.

Una volta che avete scritto un programma in OPL, potete mandarlo in esecuzione dall'interno del menu Prog, oppure direttamente dal menu principale o, anche, mentre state lavorando con la calcolatrice o col Pocket Spreadsheet.

Un programma OPL consiste di una o più procedure, ciascuna delle quali è scritta separatamente. Un programma semplice può consistere di una sola procedura. mentre un programma complesso consisterà di una procedura principale che ne richiama altre.

Il modo più efficiente di usare l'OPL consiste nello scrivere procedure brevi che possano essere testate separatamente. Ciascuna procedura dovrebbe, idealmente, svolgere una sola specifica funzione. In tale modo, programmi destinati a svolgere funzioni simili, potrebbero utilizzare, per svolgere lo stesso compito, la stessa procedura.

Questo capitolo vi mostrerà come scrivere, salvare e mandare in esecuzione una semplice procedura e copre tutto le opzioni del menu Prog.

IL MENU PROG

Il menu Prog si presenta cosi:

11:32a Edita Nuovo Esegue Stampa Lista Copia  Cancel

Il menu Prog mette a disposizione la seguenti opzioni:

Edita Vi concerne di modificare una procedura preesistente.
Nuovo Vi permette di scrivere e salvare una nuova procedura.
Esegue Manda in esecuzione una procedura.
Stampa Stampa una procedura su una stampante o su un calcolatore che siano stati opportunamente collegati.
Lista Fornisce l'elenco delle vostre procedure.
Copia Copia una procedura su un altro dispositivo.
Cancel Cancella una procedura.

CREARE, SALVARE E MANDARE IN ESECUZIONE UNA PROCEDURA

La semplice procedura riportata qui di seguito ripulisce lo schermo e visualizza la data fino a quando non premete un tasto qualsiasi. Il nome della procedura è DATA:

DATA: CLS PRINT "TODAY IS",DAY;"/";MONTH GET

CREARE UNA NUOVA PROCEDURA

Dopo la parola Nuovo è indicato il dispositivo corrente; in questo caso A: (la memoria interna). Nel caso voleste lavorare con un DataPack, premete MODE per cambiare dispositivo.

La prima cosa da scrivere è il nome della procedura: questo può essere costituito, al massimo, da 8 caratteri e deve iniziare con un carattere alfabetico.

Il nome della procedura viene mostrato seguito da due punti con il cursore che lampeggia subito dopo questi.
DATA:_

Se non conoscete ancora i tasti, consultate il paragrafo del manuale d'uso relativo da tastiera.

NOTA: In OPL è possibile usare indifferentemente, ed in ogni combinazione, i caratteri maiuscoli e quelli minuscoli.

Assicuratevi che la linea appaia sullo schermo esattamente come appare qui poichè anche gli spazi sono importanti. Qui di seguito viene fornita un'analisi della linea:

La funzione GET attende che, prima di eseguire la restante parte del programma, venga premuto un tasto. In questo modo, quando mandate in esecuzione DATA, la data rimarrà visualizzata sullo schermo fino a quando non premerete un tasto.

CORREGGERE QUELLO CHE AVETE SCRITTO

È sempre possibile, in qualsiasi momento, correggere quello che avete scritto:

È possibile anche premere MODE e, quindi, fare uso di quattro delle opzioni offerte dal menu dell'editor:

Trova Vi consente di fare una ricerca per chiave (per eliminare l'invito, premete ON/CLEAR).
Inizio Vi porta all'inizio del file contenente la procedura.
Fine Vi porta alla fine del file contenente la procedura.
Vuota Ripulisce tutte le righe eliminando, in tal modo, l'intera procedura per permettevi di iniziare una nuova.

SALVARE E TRADURRE UNA PROCEDURA

Quando avete terminato di scrivere una procedura, potete:

Lo schema riportato qui sotto illustra le differenze tra le varie opzioni; il percorso in grassetto rappresenta il normale modo di procedere per ottenere la traduzione di una procedure nuova.

Naturalmente verrà scelta Trad per ottenere una procedure eseguibile; per vedere, però, quello che le altre opzioni offrono:

ABBANDONA

TRAD

La procedura verrà tradotta in una forma che l'OPL può eseguire, Dopo che la procedura è stata tradotto, vi verrà presentato l'invito: Salva A:DATA.

Potete, ora, salvare la procedura tradotta.

Siete ora nuovamente nel menu Prog. Quando una procedura tradotta viene salvata, viene salvata anche la versione originale, in modo che, oltre a poter essere mandata in esecuzione, essa può anche venir modificata.

Errori di sintassi

Durante la traduzione, l'OPL identifica gli eventuali errori di battitura: se, ad esempio, avete scritto PRONT o avete dimenticato le virgolette, riceverete il seguente messaggio:

ERRORE   ERR DI SINTASSI   .................... premi SPACE  

SALVA

Quando vi limitate a salvare una procedura, senza tradurla, non viene eseguita nessuna ricerca di errori. Il testo è solo salvato, così come è stato battuto.

Se, per esempio, avete scritto una procedura solo in parte e vi ripromettete di riprenderla per completarla, allora, invece di Trad, potete scegliere l'opzione Salva: eviterete così di sprecare spazio per una traduzione del tutto inutile.

Dove dovrebbero essere salvati i programmi

Il posto migliore per salvare una procedura è il dispositivo A: o un Rampak. Così, se una procedura richiede più di una versione prima di operare correttamente, ogni versione non consumerà spazio:

Quando, poi, la versione finale di una procedura è pronta e disponibile su A:, è buona cosa trasferirla su un Datapak.

3 MANDARE IN ESECUZIONE UNA PROCEDURA

Quando, poi, avete tradotta con successo una procedura, potete mandarla in esecuzione.

Quando DATA viene eseguita, lo schermo prima si ripulisce e poi mostra qualcosa del genere (in dipendenza della data):

TODAY IS 19/8

Come ricorderete, l'ultima istruzione della procedura era GET: questa istruzione mette il programma in attesa che sia premuto un tasto. Così, quando premete un tasto, la procedura riprende e termina e voi siete riportati al menu Prog.

EDITA, STAMPA, LISTA, COPIA, CANCEL

Analogamente ad Esegue, anche le altre opzioni del menu Prog richiedono che sia specificata una procedura.

Se non avete ancora lasciato il menu Prog, alle opzioni Edita e Stampa viene passato automaticamente il nome dell'ultima procedura su cui avete lavorato; se è quello desiderato, premete EXE, in caso contrario potete usare ↓ per cercare il nome voluto nell'elenco delle procedure,

Per ulteriori dettagli circa la selezione dei file, vedere il Capitolo 12 del manuale d'uso.

EDITARE UNA PROCEDURA GIA' ESISTENTE

L'opzione Edita del menu Prog vi permette di riprendere una vecchia procedura per modificarla.

Quando avete finito di editare la procedura potete scegliere tra le seguenti possibilità:

o, nel caso che durante l'editing abbiate rovinato tutto,

STAMPA DI UNA PROCEDURA

L'opzione Stampa viene usata per ottenere un listato di una procedura o su una stampante o su un personal computer.

Se all'Organiser non è collegata nè una stampante, ne un personal computer, verrà visualizzato il seguente messaggio d'errore:
DISP INESISTENTE

Per maggiori dettagli sulla stampa, vedere il Capitolo 17 del manuale d'uso.

L'ELENCO DELLE PROCEDURE

L'opzione Lista del menu Prog mostra l'elenco delle procedure memorizzate sul vari dispositivi.

Se è il caso, cambiate dispositivo col comando MODE, quindi scorrete l'elenco con ↓ come si fa con l'opzione Lista dei menu Altri. Vedere anche il Capitolo 15 dei manuale d'uso.

COPIARE UNA PROCEDURA

L'opzione Copia del menu Prog permette di copiare una procedura da un dispositivo ad un altro.

Copia   Tipo di scelta   .................... Opl Oplobj Opltxt

Opl Copia sia il testo di una procedura sia il suo codice oggetto tradotto.
Oplobj Copia solo il codice oggetto.
Opltxt Copia solo il testo editabile.

Il comando Copia del menu Prog opera in modo del tutto simile al comando Copia del menu Altri.

Attenzione: Se copiate una procedura su un dispositivo che ne contiene già un'altra con lo stesso nome, quest'ultima andrà persa, anche nel caso che la procedura esistente sia il sorgente e quella che copiate sia l'oggetto.

CANCELLARE UNA PROCEDURA

L'opzione Cancel del menu Prog permette dl eliminare una o più procedure da un qualsiasi dispositivo.

Se è necessario, potete cambiare dispositivo col comando MODE. Scegliete, poi, il file o i file da eliminare allo stesso modo di quando si usa l'opzione Cancel di Altri.

MANDARE IN ESECUZIONE UNA PROCEDURA DAL MENU PRINCIPALE

Per inserire il nome di una procedura nel menu principale:

Da questo momento, quando ne selezionate il nome, la procedura viene mandata in esecuzione.

Per esempio, potreste scrivere, tradurre e salvare una procedura come quella riportata qui di seguito e, quindi, caricarne il nome, ID, nel menu principale. Quando poi la voce ID verrà scelta, il vostro Organiser verrà identificato.

ID: CLS PRINT "SE TROVATO PREGASI TELEFONARE" PRINT "PAUL SMITH EXT. " GET

INTERROMPERE ED ABBANDONARE UNA PROCEDURA IN ESECUZIONE

Può capitare che si voglia fermare una procedura mentre è in esecuzione. Per bloccare l'esecuzione di una procedura:

Questo la bloccherà indefinitamente (a meno che la procedura, per effetto di qualche funzione tipo GET, non stia attendendo che venga premuto un tasto).

Se la procedura era stata mandata in esecuzione dal menu principale, lo schermo apparirà cosi:

ERRORE   ESCAPE IN A:procname .................... premi SPACE

Se la procedura era, invece, stata mandata in esecuzione dal menu Prog, lo schermo mostrerà il seguente messaggio:

ERRORE   ESCAPE   .................... Edita A:procname S/N

CAMBIARE IL NOME AD UNA PROCEDURA

È possibile usare l'opzione Copia per cambiare il nome ad una procedura che volete salvare anche sotto un altro nome. Per cambiare il nome da A:DATA ad A:TODAY:

TRADURRE UNA PROCEDURA PER UN XP O PER UN CM

Se volete creare una procedura che possa essere eseguita anche dall'Organiser modello CM o modello XP:

Quando mandate in esecuzione una procedura creata per un XP o tradotta con l'opzione Xtrad, tutto quello che viene scritto sullo schermo sarà incorniciato come nell'esempio riportato qui di seguito.

XXXXXXXXXXXXXXXXXXXX XX 2-LINE PROC XX XX XX XXXXXXXXXXXXXXXXXXXX

SOMMARIO

CARICARE E MANDARE IN ESECUZIONE UNA PROCEDURA
INSERIRE IL NOME DI UNA PROCEDURA NEL MENU PRINCIPALE.

Da ora in poi, ogni volta che ne selezionate il nome, la procedura viene mandata in esecuzione.

USCIRE DA UNA PROCEDURA IN ESECUZIONE

2 PROCEDURE E VARIABILI

Nel capitolo precedente si è trattato dell'uso dei menu Prog. I prossimi cinque capitoli tratteranno i concetti base della programmazione in OPL. Se avete familiarità con i linguaggi di programmazione, limitatevi a dare una scorsa a questi capitoli o consultate le sezioni di riferimento che seguono.

Generalmente le procedure consistono di quattro fasi come è mostrato in questo esempio semplificato:

1 Nome SINE50:
2 Dichiarazioni delle variabili LOCAL x
3 Operazioni sulle variabili x = SIN(50)
4 Comunicazione di variabili PRINT x

Questo capitolo tratta appunto di queste quattro fasi.

1 I NOMI DELLE PROCEDURE

Esempio: print:, shares89:, TAXCALC:

Possono essere lunghi fino a 8 caratteri e possono contenere sia numeri e che lettere. Il primo carattere deve essere una lettera.

Terminano con due punti (:), ma questi vanno scritti solo in certi casi. Per esempio, non vanno scritti quando si dà il nome ad una nuove procedura, ma vanno inseriti quando si chiana una procedura da un'altra.

Possono essere scritti sia in lettere maiuscole che minuscole.

2 DICHIARAZIONE DELLE VARIABILI

Dovendo sommare due numeri, in algebra potreste scrivere 'x+y=z'. In OPL si deve scrivere z=x+y, inoltre, prima dovete dichiarare x, y e z come variabili per riservare loro uno spazio di memoria. Farete così:

1 Dichiarerete le variabili, chiamandole x, y e z, allo scopo di riservare per esse tre spazi nella memoria.
LOCAL x,y,z
2 Assegnerete valori a x e ad y.
x=5
y=2
3 Sommerete x e y e assegnerete il risultato a z:
z=x+y

Una variabile è quindi una zone di memoria a cui è stato assegnato un nome e che voi dichiarate proprio all'inizio della procedura. Ciò significa, in pratica, che comunicate all'Organiser la vostra intenzione di usare la variabile in modo che vi sia spazio per immagazzinare il numero o il testo che le assegnerete più tardi. Così, nell'esempio SINE50, la riga 'LOCAL x' riserva uno spazio di memoria chiamato x in cui verrà memorizzato il valore dato a x nella riga successiva.

I NOMI DELLE VARIABILI

Vi sono tre tipi di variabili che, quando vengono dichiarate, sono identificate per mezzo del formato del nome. I tre tipi sono:

Variabili a virgola mobile    per es. x
Variabili intere per es. x%
Variabili a stringa per es. x$

Tutti i nomi di variabili possono essere lunghi fino a 8 caratteri; il primo carattere deve essere una lettera mentre gli altri caratteri possono essere lettere o numeri, ma non simboli ad eccezione degli identificatori % e $ posti alla fine.

LE VARIABILI A VIRGOLA MOBILE

Un numero a virgola mobile è un numero che ha un punto decimale e, dopo di questo, un qualsiasi numero di cifre. Per esempio, 13.567 oppure 8. oppure 0.05319 o, anche, 6.0

Si dovrebbe sempre dichiarare a virgola mobile ogni variabile a cui si sa già che, probabilmente, verranno assegnati numeri a virgola mobile.

Il nome di una variabile a virgola mobile non ha nessun simbolo speciale alla fine.

Es. a, AGE, PROFIT89.

Le variabili a virgola mobile vengono memorizzate con una precisione di 12 cifre e deve avere valori compresi tra 9.99999999999E99 e 1E-99 oppure valere 0.

LE VARIABILI INTERE

Per numero intero si intende un numero senza parte decimal, e per es. 6, 13, -3 o 11058. Si dovrebbero usare sempre variabili intere ogni volta che non si devono usare numeri a virgola mobile e velocità e spazio sono importanti. L'aritmetica degli interi è più veloce di quella dei decimali e occupa due byte di memoria invece di otto.

Il nome di una variabile intera termina col carattere %. (Il segno % va contato tra gli otto caratteri).

Esempio: 3%, AGE%, PROFIT89%.

Le variabili intere possono avere valori compresi tra -32768 e +32767,

LE VARIABILI A STRINGA

Una stringa è una sequenza di caratteri, alfabetici, numerici o simbolici, trattate alla lettera invece che calcolate. Esempi di stringhe sono: "x+y=" e "01-345-2908" e "profit".

Il nome di una variabile a stringa termina con $. (Il simbolo $ va cornate tra gli 8 caratteri).

Esempio: a$, NAME$, MAN6$.

Quando dichiarate una variabile a stringa, dovete dichiarare anche la lunghezza massima della stringa che vi aspettate di assegnarle. Così, se volete assegnare a NAMES nomi lunghi fino a 15 caratteri, dovete dichiarare NAME$(15). II numero va messo fra parentesi.

La lunghezza massima di una stringa è di 255 caratteri.

I COMANDI LOCAL E GLOBAL

La dichiarazione delle variabili deve comparire immediatamente dopo il nome della procedura; è possibile elencare contemporaneamente tutti e tre i tipi in un qualunque ordine; essi vanno separati da virgole come in questo esempio:

LOCAL x,y,a%,NAME$(15),YEAR3%

Per dichiarare le variabili potete usare sia il comando LOCAL che il comando GLOBAL:

LOCAL x, a%, list$(8)

oppure

GLOBAL x, a%, list$(8)

LOCAL e GLOBAL definiscono il campo in cui le variabili operano. La differenza di base è la seguente:

Le variabili local sono attive solo nella procedura in cui sono state dichiarate.

Le variabili global possono essere usate in qualunque procedura chiamata dalla procedura in cui esse sono state dichiarate.

RICHIAMO DI PROCEDURE

Un programma OPL può essere costituito da più di una procedura. Voi dovete, però, battere, tradurre e salvare ogni procedura separatamente.

Nell'esempio che segue, la quarta riga di proca: chiama un'altra procedura, procb:. Per fare ciò, basta battere il nome delle procedura (col due punti:).

proca: GLOBAL a% a%=2 procb: PRINT a%

procb: a%=a%+4

La variabile a% viene dichiarata come globale in modo che possa essere usata anche nella seconde procedura. In questo esempio il valore quando proca: viene eseguita è 6.

L'unico pericolo con le variabili globali è che potete commettere l'errore di usare accidentalmente lo stesso nome di variabile due volte. Per evitar ciò, si dovrebbe usare sempre il contando LOCAL a meno che non sia specificatamente richiesto quello GLOBAL.

Se s'imbatte in una variabile che non è dichiarata ella procedura, l'OPL presuppone che essa sia stata dichiarata in una procedura precedente. OPL quindi segnalerà un errore di MISSING EXTERNAL se non riesce a trovare la variabile globale nella procedura chiamante.

ALTRE VARIABILI
Le memorie delle calcolatrice

Vi sono dieci variabili a virgola mobile che sono sempre disponibili. Queste sono le memorie m0, ..., m9 della calcolatrice. Queste non vanno dichiarate come variabili perché esistono sempre.

Ad esse possono essere assegnati valori in ogni momento ed in ogni procedura. È possibile quindi accedere ad esse dalla calcolatrice.

VARIABILI A SCHIERA

Può succedere di voler dichiarare, all'inizio di un programma, un gran numero di variabili simili; a questo scopo OPL utilizza le variabili a schiera.

L'idea è semplicemente: invece di dover dichiarare separatamente le variabili a, b, c e d, potete dichiarare le variabili da a1 ad a15 in una volta sola in questo modo:

LOCAL a%(5) (schiera di variabili intere)
LOCAL a(5) (schiera di variabili a virgola mobile)
LOCAL a$(5,8) (schiera di variabile a stringa)

Una variabile a schiera numerica può essere considerata come un elenco di numeri, ognuno con lo stesso nome, ma con un numero indice che li differenzia.

Quando le schiera è dichiarata, il numero tra parentesi è il numero dei suoi elementi. Ecco un esempio semplice che assegna valori agli elementi di una schiere di interi:

procname: GLOBAL num%(4) num%(1)=1 num%(2)=3 num%(3)=5 num%(4)=7 PRINT num%(1)+num%(2)+num%(3)+num%(4)

Questo esempio stampa la somma dei quattro elementi della schiera num%.

Per le stringhe, si devono dichiarare il numero di elementi nella schiera e la lunghezza massima delle stringhe.

Per esempio, GLOBAL ARRAY$(5,10) assegna spazio di memoria per cinque stringhe, ognuna lunga fino a dieci caratteri, sotto il nome di ARRAY$(1) y ARRAY$(5). Fin qui, ognuna delle variabili è vuota (stringa nulla), ma si deve riservare sufficiente memoria per contenere tutte le cinque stringhe quando saranno piene.

3 OPERAZIONI SULLE VARIABILI

Una volta che le vostre variabili sono stare dichiarate, potete eseguire su di esse qualsiasi numero di operazioni. Queste potrebbero essere una combinazione di operazioni aritmetiche oppure le variabili potrebbero essere passate ad altre procedura perché queste operino su di loro, oppure si potrebbe usare une delle funzioni OPL.

Qualunque cosa facciate, comunque, dovete avere chiaro come le variabili si comportano in funzione del tipo e a seconda di come voi le combinate.

Per esempio, non potete dividere una variabile a stringa per una variabile intera. Oppure, se nella stessa somma mescolate variabili intere e variabili a virgola mobile, è possibile convertire le variabili di un tipo in quello delle altre. Le sezioni seguenti mostrano in dettaglio quali problemi potrebbero sorgere e come evitarli.

MISCHIARE VARIABILI INTERE E VARIABILI A VIRGOLA MOBILE: CONVERSIONE AUTOMATICA

Nella procedure che segue è presente un potenziale errore, nella terza riga dopo il nome, dove alla variabile intera y% è assegnato il valore a virgola mobile:

procname: GLOBAL x%,y% x%=7 y%=3.7+x% PRINT y% GET

OPL tratta il problema nel modo seguente: Invece di segnalare un errore, l'OPL opera internamente una conversione automatica del tipo sui valore assegnato alla variabile scelta erroneamente.

La parte di destra di y%=3.7+x% è valutata 10,7. La parte frazionaria del numero, comunque, viene abbandonata prima che il risultato sia assegnato alla parte di sinistra, y%. Quindi l'istruzione PRINT mostrerà il valore di 10.

Poichè l'OPL non segnala ciò come errore, sta a voi assicurarvi che ciò non accada, a meno che non lo vogliate! Dovete sempre porre attenzione quando mischiate tipi di variabili che la risposta data sia quella che vi aspettate.

Nella procedura che segue, dove vengono usate solo variabili a virgola mobile, potete vedere che viene fatta un altro tipo di conversione che, però, non cambia il valore:

procname: GLOBAL a,b,c a=1.2 b=2.7 c=3 PRINT a+b+c

In questa procedura alla variabile a virgola mobile c viene assegnato il valore intero di 3. In tali casi viene eseguita automaticamente una conversione di tipo. Qui il risultato è convertito a 3.0, quindi ii valore reale della variabile rimane lo stesso.

Se assegnate un numero a virgola mobile a una variabile intera, allora la conversione automatica genererà un intero arrotondato per difetto. Cosi, se scrivete a%=2.3, allora il valore di a% sarà 2; ma anche a%=2.9 darebbe ad a% il valore 2. Se, poi, assegnate un numero a virgola mobile negativo a una variabile intera, il numero viene ancora arrotondato per difetto, ma non più invalore assoluto, cosicchè, se voi scrivete a%=-2.3, allora a% assumerà il valore di -3 e ciò, in genere, non è quello che si desidera.

Se vi aspettate che un'espressione dia come risultato un numero a virgola mobile, dovete assicurarvi che, all'interno dell'espressione, siano usati i tipi corretti di numeri.

È possibile, comunque, controllare l'arrotondamento del numeri a virgola mobile quando sono convertiti. Per esempio, se voleste arrotondare numeri a virgola mobile alla mezza unita più vicina (cosi 2.4 diventerebbe 2.5 e 2.2 diventerebbe 2) allora potreste utilizzare l'istruzione seguente:

r=INT(2*n+0.5)/2

dove n è il numero che deve essere arrotondato.

Questo metodo, però, può in alcuni casi dare un risultato errato. Per capire il perchè, sostituite ad n un valore reale, per esempio 3.4:

INT(2*3.4+5) cioè INT(7.3)

Viene restituito l'intero 7. Ma quando 7/2 viene arrotondato per difetto, da l'intero 3. non 3.5.

Per ottenere 3.5 dovete forzare la divisione in modo che dia un risultato a virgola mobile. In questo caso il modo più semplice di operare è dividere per il valore a virgola mobile di 2.0 invece dell'intero 2. Quindi l'espressione:

r=INT(2*n+0.5)/2.0

darà il risultato richiesto.

Nel capitolo sugli Operatori troverete maggiori dettagli sulle variabili intere e a virgola mobile.

MISCHIARE STRINGHE E NUMERI

Se si tenta di assegnare un numero a una variabile a stringa, viene segnalato un errore. Non vi è conversione automatica tra variabili numeriche e variabili a stringa. Comunque l'OPL mette a disposizione del programmatore i mezzi per forzare la conversione di numeri in stringhe e viceversa. Questi sono le funzioni SCI$, FIX$, GEN$ e VAL.

CONCATENAZIONE DI STRINGHE

Sommare stringhe è facile come sommare variabili numeriche:

Quando si concatenano più stringhe, il risultato non può essere più lungo della lunghezza massima dichiarata.

SEGMENTAZIONE DI STRINGHE

È possibile anche segmentare (spezzare) le stringhe. Questo processo è conosciuto come segmentazione di una stringa.

Vi sono tre funzioni che vi permettono di fare questo. Esse sono LEFT$, RIGHT$ e MID$. Esse vi permettono di accedere rispettivamente alla parte sinistra di una stringa, a quella destra o quella centrale. Per esempio:

L'operazione di segmentazione lascia immutata la stringa originale-cioè a$ avrebbe sempre il valore di 01-234-5782 anche dopo che b$ ha assunto il valore 01. L'eccezione sarebbe quando il membro di sinistra dell'espressione fosse la stessa stringa che appare nel membro destro. Così, ad esempio, a$=LEFT$(a$,4) darebbe una stringa contenente i quattro caratteri più a sinistra di a$ e l'assegnerebbe a a$, sovrapponendoli, così, al valore originale.

Nota: se dovete definire una stringa che includa il carattere virgolette (carattere ASCI 34), allora questo carattere deve essere inserito due volte nella stringa. Così, se scrivete a$="x""y""z", allora il valore risultante di a$ sarà x"y"z.

4 COMUNICAZIONE DI VARIABILI

Nella prima procedura esempio, all'inizio del capitolo, l'istruzione PRINT x si limita a prelevare il valore trovato nello spazio di memoria assegnato alla variabile x e visualizzarlo sullo schermo.

I valori possono anche essere passati tra procedure. Nell'esempio a pagina 2-3 la procedura proca: chiamava un'altra procedura, procb: che, a sua volta, restituiva a proca: il valore modificato di a%. La variabile a% era stata dichiarata globale perchè questo fosse possibile.

Il resto di questo capitolo tratta di altri modi per passare valori: inserire valori dalla tastiera con il comando INPUT e passare i valori tra procedure usando parametri.

IL COMANDO INPUT

I valori possono essere inseriti usando la tastiera per mezzo del comando INPUT, come si vede nell'esempio sottostante.

Questa semplice procedura vi chiede solo di inserire un numero. Il numero che inserite viene assegnato alla variabile x e viene poi stampato sullo schermo con un messaggio:

INPUT: LOCAL x CLS PRINT "ENTER NUMBER" INPUT x CLS PRINT "YOU ENTERED", x GET

Per maggiori dettagli sul comando INPUT, vedere il Capitolo 9.

I PARAMETRI DELLE PROCEDURE

Si possono passare valori fra due procedure mediante i parametri. Nell'esempio VAT sottostante, la seconda procedura VAT1: è seguita dal nome di un parametro (p).

L'ultima riga della prima procedura PROC1: chiama VAT1 col valore di x. Il valore di x è copiato sul parametro p. VAT1:, quindi, stampa questo valore più l'IVA al 15%.

PROC1: LOCAL x CLS PRINT "ENTER PRICE" INPUT x VAT1:(x) VAT1:(p) CLS PRINT "PRICE INCLUDING VAT =",p*1.15 GET

PARAMETRI MULTIPLI

In questo esempio, simile all'esempio VAT, la seconda procedura VAT2: ha due parametri.

Il valore della variabile prezzo, x, è passato al parametro p1 e anche la percentuale VAT che è la variabile r viene passata al parametro p2. VAT2 quindi stampa il prezzo più VAT (IVA) alla percentuale specificata.

PROC2: LOCAL x,r CLS PRINT "ENTER PRICE" INPUT x CLS PRINT "ENTER VAT RATE" INPUT r VAT2:(x,r)

VAT2:(p1,p2) CLS PRINT p1+p2/100*p1 GET

IL COMANDO RETURN

Questo nuovo esempio VAT differisce dai due esempi precedenti in quanto il controllo non termina con la seconda procedura, ma torna invece alla prima.

Il comando RETURN è usato per restituire il valore di x più VAT alla percentuale r che sarà stampato in PROC3:. Ora VAT3: si limita a fare il calcolo, ma non stampa. Ciò significa che essa potrebbe essere chiamata da altre procedure che necessitano di questo calcolo, senza, necessariamente, di stamparli.

PROC3: LOCAL x,r CLS PRINT "ENTER PRICE" INPUT x CLS PRINT "ENTER VAT RATE" INPUT r CLS PRINT "PRICE INCLUDING VAT =",VAT3:(x,r) GET

VAT3:(p1,p2) RETURN p1+p2/100*p1


3 CICLI E SALTI

Fin qui abbiamo preso in considerazione solo programmi che procedono linearmente dall'inizio alla fine. Essi consistono di un certo numero di istruzioni che vengono eseguite nell'ordine in cui appaiono nel programma; se si vuole eseguire un'istruzione più di una volta, è necessario ripeterla.

Questo metodo non è, chiaramente, molto efficiente. Un metodo di gran lunga più efficiente è quello in cui il programma è in grado di ripetere una particolare parte tutte le volte che è necessario, o finchè non si verifichi una particolare condizione.

Nell'OPL vi sono parecchi modi per ottenere questo risultato.

I primi due sono i cicli DO/UNTIL e WHILE/ENDWH. Essi sono conosciuti come strutture e operano in modo simile, ma con una differenza.

È possibile avere fino ad otto cicli annidati uno nell'altro.

IL CICLO DO/UNTIL

Ecco un esempio di ciclo DO/UNTIL:

a%=10 DO PRINT "a=";a% a%=a%-1 UNTIL a%=0

Per prima cosa alla variabile a% viene assegnato il valore 10, il ciclo inizia sulla riga seguente con l'istruzione DO. Questo ordina all'OPL:

"Esegui tutte le istruzioni che seguano fino a che non raggiungi UNTIL. Se le condizione che segue UNTIL non è soddisfatta ripeti la stessa serie di istruzioni finchè essa non lo sia".

La riga successive mostra "A=", seguita dal valore di a%. La prima volta del ciclo questo vale 10.

Successivamente, al valore di a% viene sottratto 1 in modo che a% sia 9. Ora interviene UNTIL seguito da una condizione. La condizione è che a% sia uguale a zero. Non lo è ancora, così il programma torna a DO e il ciclo viene ripetuto. Ora a% scende a 8 e, di nuovo, la condizione risulta non soddisfatta. Il processo continua finchè a% non è uguale a zero.

Quando a% è uguale a zero il ciclo finisce e il programma continua con le istruzioni che seguono UNTIL.

IL CICLO WHILE/ENDWH

Il ciclo WHILE/ENDWH è del tutto simile al precedente, tranne che la condizione è verificata all'inizio. Per esempio:

a=4.1 b=2.7 WHILE a>b PRINT "a è maggiore di b" b=b+1.04 ENDWH

BREAK

L'istruzione Break può essere usata assieme all'istruzione IF per interrompere un ciclo DO o WHILE. Esso salta direttamente alle istruzioni che seguono alla fine del ciclo.

ETICHETTE E SALTI

Un altro comando che può penare il programma fuori da una sequenza lineare e GOTO. Esso salta a un'etichetta.

In questo esempio, quando il programma raggiunge GOTO, esso salta alla riga che comincia con l'etichetta exit::.

GOTO exit:: PRlNT "MISS THIS LINE" PRINT "AND THIS ONE" exit::

Le etichette terminano con un doppio due punti (::).

L'etichetta deve essere nella stessa procedura in cui si trova GOTO e il salto non è soggetto a condizioni: esso ha sempre luogo.

SALTI

GOTO è un modo di effettuare un salto, ma è uno strumento alquanto grezzo e può rendere difficile la lettura delle procedure.

La struttura IF/ELSEIF/ELSE/ENDIF è migliore. Questa struttura è usata per eseguire una o più istruzioni se una condizione è soddisfatta. Se non lo è, si può usare l'istruzione ELSEIF per controllare un'altra condizione. È possibile avere un numero qualunque di istruzioni ELSEIF all'interno di una struttura IF/ENDIF. Dopo che tutte le situazioni possibili sono state previste nelle istruzioni ELSEIF, altre situazioni possono essere previste in uno statement ELSE, seguito, poi, dall'istruzione ENDIF. Ecco un esempio:

whatkey: LOCAL g% g%=GET PRINT "THAT KEY IS" IF g%>64 AND g%<91 PRINT "UPPER CASE" ELSEIF g%>96 AND g%<123 PRINT "lower case" ELSE PRINT "NOT A LETTER" ENDIF GET

Il programma aspetta solo che venga premuto un tasto, e poi stampa se si è trattato di una lettera maiuscola o minuscola. (Se non vi è chiaro il significato dei numeri 64 e 91, andate all'Appendice A). Se non si tratta di una lettera, allora ciò è stampato come previsto dall'istruzione ELSE.

Le istruzioni ELSEIF e ELSE sono opzionali, ma per ogni IF vi deve essere un ENDIF corrispondente.

CICLI SENZA FINE

ESCAPE OFF, GET, KEY devono essere usati nei cicli con grande cautela per i seguenti motivi:

Per fermare l'esecuzione di una procedura normalmente si preme ON/CLEAR e poi A.


4 GLI OPERATORI

Operatori aritmetici
+somma
-sottrae
*moltiplica
/divide
**eleva a potenza
-cambia di segno
%percentuale
Operatori di confronto
>maggiore di
>=maggiore o uguale di
<minore di
<=minore o uguale di
=uguale a
<>diverso da
Operatori logici

AND OR NOT

ORDINE DI PRECEDENZA DEGLI OPERATORI
Il più allo: **
- (Cambio di segno) NOT
* /
+ -
= > < <> >= <=
Il più basso: AND OR

L'operatore per cento % è particolare in quanto i suoi effetti dipendono dall'operatore con cui si combina. Il modo in cui % lavora è descritto nei capitolo sulla calcolatrice del manuale d'uso.

USO DELLE PARENTESI

Un'espressione come a+b+c non presenta problemi poichè il risultato è sempre lo stesso, indipendentemente da quale somma venga eseguita per prima. Potreste, però, voler imporre un ordine di precedenza utilizzando le parentesi. Per esempio:

a+b*c/d

viene calcolato nel seguente ordine: b è moltiplicato per c, poi diviso per d, quindi sommato ad a. Per eseguire la somma e la divisione prima della moltiplicazione, fate uso delle parentesi:

(a+b)*(c/d)

Ogni volta che avete dei dubbi, usate le parentesi.

ORDINE DI PRECEDENZA DEI VALORI INTERI E A VIRGOLA MOBILE

Siete liberi di mescolare nelle espressioni valori interi e a virgola mobile; dovete, però, sapere coma l'OPL gestisce il tutto:

poi, comunque,

Per esempio, la vostra procedura potrebbe includere l'espressione:

a%=b%+c

I calcolo avverrà in questo modo: dapprima b% è convertito a virgola mobile e sommato a c, quindi il risultante valore a virgola mobile è quindi automaticamente convertito in un intero per essere assegnato alla variabile intera a%.

Queste conversioni possono dare risultati strani, quindi state attenti. Per esempio, a%=3.0*(7/2) assegna 9 ad a%, mentre a% = (3.0*7)/2 assegna ad a% 10.

LE ESPRESSIONI LOGICHE

Gli operatori di confronto e gli operatori logici si basano sull'idea che una certa situazione possa essere valutata come vera o falsa. Per esempio, se a%=6 e b%=8, allora a%>b% sarebbe falso. Essi sono utili per impostare percorsi alternativi nelle vostre procedure. Per esempio, si potrebbe scrivere:

IF salary<expenses PRINT "bad" ELSEIF salary>expenses PRINT"good" ENDIF

È possibile usare anche il fatto che il risultato di queste espressioni logiche è rappresentato da un intero:

Questi interi possono essere stampati sullo schermo per farvi sapere se una particolare condizione è vera o falsa, o passati ad una variabile per essere usati in un'istruzione IF.

Per esempio, in una procedura potrebbe capitarvi di ottenere due totali parziali, a e b, e di voler sapere qual'è il maggiore. Includete quindi l'istruzione PRINT a>b: se appare lo zero, allora a e b sono uguali o b è il maggiore, ma se appare -1, allora vuol dire che 'a>b' è vera a, quindi, che a è il maggiore.

EsempioRisultatoIntero restituito
 
< a<b Vero se a minore di b -1
Falso se a maggiore di o uguale a b 0
 
> a>b Vero se a maggiore di b -1
Falso se a minore di o uguale a b 0
 
<= a<=b Vero se a minore di o uguale a b -1
Falso se a maggiore di b 0
 
>= a>=b Vero se a maggiore o uguale a b -1
Falso se a minore di b 0
 
<> a<>b Vero se a non uguale a b -1
Falso se a uguale a b 0
 
= a=b Vero se a uguale a b -1
Falso se a non uguale a b 0

È possibile usare questi operatori con espressioni miste contenenti valori interi e a virgola mobile. Comunque se un termine del confronto è a virgola mobile e l'altro è un intero, l'intero viene convertito in virgola mobile. Così se a%=1 e b=1.2, allora ba% e è vero. Non è possibile usare assieme valori di stringa e valori numerici, quindi l'espressione a$ non è valida.

Pochi programmatori avranno bisogno delle informazioni che seguono, quindi saltate il resto del capitolo se esso vi spaventa.

Gli operatori logici AND, OR e NOT hanno effetti diversi a seconda che siano usati con numeri interi o con numeri a virgola mobile:

1 Quando usati unicamente con numeri a virgola mobile, gli operatori logici hanno i seguenti effetti:

EsempioRisultatoIntero restituito
a AND b Vero se a e b sono non-zero -1
Falso se sia a che b sono zero 0
a OR b Vero se a o b sono non-zero -1
Falso se a e b sono zero 0
NOT a Vero se a è zero -1
Falso se a è non-zero 0

2 Quando usati unicamente con valori interi, AND, OR e NOT sono operatori logici che operano bit a bit.

L'Organiser rappresenta internamente i numeri interi come numeri binari a 16 bit. Così, e 7 corrisponde il numero binario: 0000000000000111

Il campo di rappresentazione numerica dell'Organiser è da +32767 e -32768. 32767 è il massimo numero rappresentabile con 15 cifre binari. Il sedicesimo bit è usato per rappresentare il segno.

Poichè gli operatori operano bit a bit, essi eseguono le operazioni prima sui primo bit, poi sul secondo, e così, fino al sedicesimo.

AND   L'istruzione PRINT 12 AND 10 stampa 8. Per capire il perchè, scrivete 12 e 10 in binario:
12 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0

AND agisce su ogni coppia di bit, quindi, lavorando da sinistra a destra - trascurando i primi 12 bit che sono tutti a zero:
1 AND 1 → 1
1 AND 0 → 0
0 AND 1 → 0
0 AND 0 → 0

Il risultato è quindi il numero binario 1000 pari al valore 8 in base decimale.

OR   Quale risultato darebbe l'istruzione PRINT 12 OR 10? Di nuovo scrivete i numeri in forma binaria e applicate l'operatore a ogni coppia di cifre:
1 OR 1 → 1
1 OR 0 → 1
0 OR 1 → 1
0 OR 0 → 0

Il risultato è il numero binario 1110, o 14 in base decimale.

NOT   NOT lavora solo su un numero. Restituisce il complemento a uno, cioè rimplazza gli zeri con 1 e gli 1 con 0.

Così, se sette è 0000000000000111
NOT 7 sarà 1111111111111000
che è la rappresentazione binaria di -8.

Suggerimento: Un modo veloce per calcolare NOT per interi è aggiungere 1 al numero originale e cambiare di segno. Quindi, NOT 23 è -24, NOT 0 è -1 e NOT -1 è 0. Gli ultimi due risultati valgono anche per numeri a virgole mobile.


5 LA GESTIONE DEI FILE DATI

Quando usate l'opzione SALVA dal menu principale, i vostri record vengono salvati su un file chiamato MAIN. Potete inoltre creare dei file dati extra coll'opzione Xfile. Dall'OPL è possibile accedere a questi flle e ai record in essi contenuti. Potete anche creare nuovi file e poi manipolarli. Questo capitolo vi spiega come fare tutto ciò.

Vi sono anche tre esempi di programmi di gestione del file dati in fondo al capitolo procedure esempio. Può essere una buona idea riferirsi a quei programmi, mentre leggete questo capitolo.

FILE, RECORD E CAMPI

Il file dati Main e qualsiasi altro file che possiate creare, contengono record che sono suddivisi in campi. Quando, con l'opzione SALVA del menu principale, salvate un record, ogni volta che iniziate una nuove riga premendo ↓, voi iniziate un nuovo campo.

In un file di nomi e indirizzi, in ciascun record, potrebbe esservi un campo nome, un campo numero di telefono e tanti campi separati quante sono le righe dell'indirizzo.

CREAZIONE DI UN FILE DATI

Prima di iniziare ad introdurre dati in un nuovo file, dovete prima crearlo su uno dei dispositivi usando l'opzione NUOVO nel menu Xfile oppure usando il comando CREATE dell'OPL.

Col comando CREATE dell'OPL si ha un maggior controllo perchè si può specificare il numero di campi che devono esservi in ciascun record e il tipo dei dati che finiranno in ciascun campo. Il comando CREATE ha la seguente sintassi:

CREATE "<dev>fnome", lognome, fldnm1, fldnm2

"fnome" indica il dispositivo (A:, B: oppure C:) su cui verrà caricato il file unitamente al nome del file. Tutto questo va messo tra virgolette come una stringa qualsiasi: ad esempio "a:clienti". È possibile, anche, assegnare a una variabile a siringa il dispositivo e il nome (ad esempio cl$="a:clienti") e quindi usare questa variabile come parametro. Il nome di un file può essere lungo fino a un massimo di 8 caratteri.

Lognome è il nome del file logico. Questo può essere A, B, C o D e viene usato per indicare il file all'interno di un programma.

fldnm1, fldnm2 sono i nomi del campi. Ogni record può contenere un massimo di 16 campi e a questi può essere assegnato un qualificatore, o % o $, per indicare numeri interi o stringhe. I campi destinati e contenere numeri a virgola mobile non richiedono alcun qualificatore. I nomi dei campi, qualificatore incluso, possono essere lunghi fino a un massimo di 8 caratteri.

Un esempio di comando CREATE potrebbe essere il seguente:

CREATE "a:clienti",B,nm$,tel$,ind1$,ind2$,ind3$

Quando un file viene creato, esso viene anche automaticamente aperto. Ciò significa che è possibile salvare subito record su di esso. Esso inoltre diventa il file corrente, il che significa che tutte le volte che utilizzate comandi di manipolazione di record questi operano su questo file.

AGGIUNGERE UN RECORD AD UN FILE

I record vengono aggiunti ad un file un campo dietro l'altro. Per prima cosa si assegnano valori ai nomi di campo correnti, quindi si utilizza il contando APPEND per aggiungerli al file.

ASSEGNARE VALORI AI NOMI DI CAMPO

I nomi di campo operano in modo del tutto simile alle variabili e ad essi possono essere assegnati valori e possono essere utilizzati nelle istruzioni di INPUT. Un nome di campo va sempre usato congiuntamente al nome del file logico, come in questo esempio:

INPUT B.nome$

oppure, come in questo esempio:

B.nome$="Sig Bruno"

dove B è il nome del file logico e nome$ è il nome del campo. Questi due nomi sono separati da un punto (.).

AGGIUNGERE CAMPI

Dopo che avete assegnato i valori ai campi potete aggiungere questi ultimi al file aperto utilizzando il comando APPEND. Essi vengono sempre aggiunti all'ultimo record del file; nel caso di un file nuovo questo sarà il primo record.

Il comando APPEND non richiede parametri: i valori dei campi verranno aggiunti automaticamente al file nell'ordine e col formato corretto.

Se tentate di assegnare una stringa ad un campo numerico vi sarà segnalato un errore.

Come esempio di aggiunta di record ad un file, vedere la seconda procedura (insert:) del programma numero 6 del Capitolo 8.

Fintanto che un file è aperto, i nomi di campo correnti possono essere utilizzati come una qualsiasi altra variabile: per esempio, in un'istruzione PRINT o in un'espressione numerica o di stringa. È necessario, però, per poter operare su un particolare campo, che il record che lo contiene sia il record corrente.

CAMBIARE IL RECORD CORRENTE

Prima di cancellare un record o di operare sui suoi campi, è necessario farlo diventare il record corrente. È possibile cambiare il record corrente utilizzando uno dei sei comandi o funzioni riportati qui sotto.

FIRST si sposta sul primo record del file

NEXT si muove sul record successivo. Se si è superata la fine del file, NEXT non dà nessuna segnalazione di errore; il record corrente sarà un record nullo. Questa condizione può essere verificata con la funzione EOF.

BACK si muove sul record precedente. Se il record corrente è il primo dei file, allora il record corrente non viene cambiato.

LAST si sposta sull'ultimo record del file.

POSITION si muove su un particolare record. Ad esempio, l'istruzione POSITION 3 fà diventare corrente il record 3 (il primo record è il record 1). È possibile sapere qual è il numero del record corrente utilizzando la funzione POS che restituisce il numero del record corrente.

FIND si sposta sul record che contiene la stringa che avete specificato.

RICERCA DI UN RECORD

Le funzione FIND opera esattamente come il TROVA del menu principale, ma senza la possibilità di caratteri jolly. Un'altra differenza consiste nel fatto che, mentre il TROVA del menu principale visualizza il record sullo schermo, la funzione FIND lo fà diventare il record corrente, rendendo cosi possibile operare su di esso: editarlo, cancellano o anche solo visualizzarlo.

Per esempio:

r%=FIND("HOLMES")

fa diventare record corrente il primo record che contiene la stringa "HOLMES" e assegna alla variabile r% il numero del record. Se tale numero è zero ciò significa che la stringa non è stata trovata.

Vi è un'altra funzione, FINDW, che è analoga a FIND e che permette l'uso dei caratteri jolly. Cosi, per trovare il primo record contenente ORDER e 89 potete usare l'istruzione: r%=FINDW("*ORDER*89*")

+ sostituisce qualsiasi carattere singolo.
* sostituisce qualsiasi gruppo di caratteri.

La procedura chiamata search: del programma N 6 del Capitolo 8 costituisce un esempio di come si trova e si edita un record.

CANCELLARE UN RECORD

Per cancellare un record lo si deve, dapprima, far diventare il record corrente utilizzando uno del comandi FIRST, NEXT, BACK, LAST, POSITION o FIND e, quindi, si usa il comando ERASE. Questo comando rimuove dal file il record corrente e rinumera i record seguenti.

La procedura finale (erase:) del programma N 6 del Capitolo 8 costituisce un esempio di come si trova e si cancella un record.

APERTURA DI UN FILE

Quando un file viene creato, esso viene anche automaticamente aperto; alla fine del programma, però, esso viene chiuso. Per aprire di nuovo il file in un altro programma, si deve usare il comando OPEN.

La sintassi del comando OPEN è uguale a quella di CREATE. Si dovranno usare lo stesso nome di dispositivo e lo stesso nome di file di quando l'avete creato; tuttavia quando l'aprite in un altro programma, potrete assegnarli un diverso nome di file logico e differenti nomi di campi. Per esempio, un file creato in un programma con il comando:

CREATE "c:indirizz",D,nome$,num$,ind$,ind2$

potrebbe essere riaperto in un altro programma col comando:

OPEN "c:indirizz",A,a$,b$,c$,d$

Si possono aprire contemporaneamente fino a quattro file che possono trovarsi su fino a tre dispositivi diversi. Ciascun file sarà identificato, nell'interno del programma, con un nome di file logico diverso. Così, se avete aperto quattro file, uno sarà A, l'altro B, l'altro ancora C e l'ultimo D.

Se sì pensa di editare o cancellare dei record dei file, è necessario includere nel comando OPEN tutti i campi su cui si pensa di operare. Tuttavia, se si pensa di fare solo delle ricerche di stringhe o di visualizzare dei record, è sufficiente includere nel comando OPEN solo il primo campo. Ad esempio:

OPEN "c:indirizz",A,a$

CAMBIARE IL FILE CORRENTE

Quando un file viene creato o viene aperto, esso diventa automaticamente il file corrente e tutti gli accessi avvengono su di esso fino a quando non decidete di voler usare un altro file. Il comando USE fa diventare corrente un determinato file. Ci si riferisce ad esso mediante il suo nome di file logico. Ad esempio:

USE B

In questo esempio il file cui e associato il file logico B (come definito nel comando CREATE o nel comando OPEN ) diventa il file corrente. Tutti gli accessi avverranno da ora su questo file fino a quando non deciderete di cambiarlo con un altro con un nuovo comando USE o con un comando CREATE o OPEN. Se si tenta di utilizzare un file che non sia stato precedentemente aperto, viene segnalato un errore.

CHIUSURA E CANCELLAZIONE DI UN FILE

I file dati si chiudono automaticamente alla fine del programma; è possibile, tuttavia, quando avete finito di accedere a un determinato file, chiuderlo utilizzando il comando CLOSE che chiude il file corrente.

Può succedere che si voglia chiudere un file quando ve ne siano già quattro aperti in un programma e se ne voglia aprire un altro oppure cancellare uno. Per cancellare un file esiste il comando DELETE: esso richiede, però, che il file da cancellare sia stato precedentemente chiuso.

ULTERIORI INFORMAZIONI SULLA GESTIONE DEI FILE

Per un sommario dei comandi delle funzioni per la gestione di un file vedere l'inizio del Capitolo 9. Si consiglia di studiarli con attenzione.

I programmi 6, 7 e 8 del capitolo 8 costituiscono buoni esempi di programmi di gestione di file.


6 GESTIONE DEI FILE DI VARIO TIPO

La maggior parte dei comandi e delle funzioni per la gestione dei file operano solo su file dati.

Ve ne sono tre, però, COPYW, DELETEW e DIRW$, che agiscono su file di qualsiasi tipo. Il tipo di file è indicato dall'estensione:

File dati e file agenda
(ODB sta per Organiser Data Base.)
.ODB
Procedure OPL.OPL
File notes.NTS
File di setup per Comms Link.COM
File di foglio elettronico.PLN
File di setup per Pager.PAG
File agenda da XP o CM.DIA

Vi sono, poi, altre due estensioni utilizzabili solo da COPYW, e che vanno usate solo per eseguire copie parziali di una procedura OPL. Esse sono:

Procedure OPL (sorgente).OPT
Procedure OPL (oggetto).OPO

COPYW, DELETEW e DIRW$ possono utilizzare i caratteri jolly; al solito, questi ultimi sono +, per un singolo carattere, e * per un gruppo di caratteri.

ESEMPI

COPYW "A:*88.OPL","B:"
Copia dal dispositivo A: al dispositivo B: tutte le procedure OPL il cui nome termina in 88.

DELETEW "C:*.NTS"
Cancella tutti i file notes presenti sul dispositivo C:.

DIRW$("A:R*")
Restituisce il nome del primo file, indipendentemente dal tipo, il cui nome incomincia per R presente sul dispositivo A:.

FILE AGENDA

I file agenda sono salvati come file dati; ciascuna registrazione costituisce un record di due campi come mostrato qui cotto:

1989042712000100   JAMES BIRTHDAY

In questo esempio, il primo campo contiene le seguenti informazioni:

1989Anno
04Mese
27Giorno
1200Ora d'inizio
01Durata - un periodo di 15 minuti
00Ora della sveglia. In questo caso vale 0 perchè la sveglia non è stata impostata.

È possibile salvare un file agenda aperto in Xfiles e, quindi, ritrovarlo e modificare i record. Ad esempio, potreste individuare tutti i vostri impegni tipo compleanno e cambiare 1989 in 1990; quindi, fondandola con quella corrente, evitereste di dover copiare, alla fine dell'anno, tutti i compleanni. Bisogna, però, prestare attenzione ad usare il giusto formato perchè altrimenti risulterebbe impossibile recuperare l'agenda.

L'operazione appena mostrata potrebbe essere effettuata anche in OPL, usando i comandi di gestione dei file e delle stringhe. Nel capitolo 8 trovate un programma che fà esattamente questo.


7 LA GESTIONE DEGLI ERRORI

Questo capitolo tratta degli errori più comuni e del loro intrappolamento. L'appendice D fornisce l'elenco dei messaggi d'errore dell'OPL.

GLI ERRORI PIÙ COMUNI

Tutti i linguaggi di programmazione richiedono grande precisione nell'uso dei comandi e della funzioni soprattutto per quanto riguarda il modo con cui le istruzioni sono scritte.

Più sotto è riportato un elenco degli errori più comuni in OPL. Le istruzioni errate son riportate in grassetto, mentre la loro forma corretta appare a destra.

ERRORI DI PUNTEGGIATURA

Omissione del due punti (:) sulla righe multiistruzione:

ErratoCorretto
a$="text" PRINT a$ a$="text" :PRINT a$

Omissione dei due punti dopo il nome di una procedura richiamata:

ErratoCorretto
proc1:
GLOBAL a,b,c
.
.
proc2
proc1:
GLOBAL a,b,c
.
.
proc2:

Omissione di uno o più due punti (:) dopo un'etichetta:

ErratoCorretto
proc1:
GOTO below:
.
.
below::
proc1:
GOTO below::
.
.
below::

Omissione dello spazio prima del due punti tra due istruzioni di una riga multiistruzione:

ErratoCorretto
proc1:
a$=b$:PRINT a$
proc1:
a$=b$: PRINT a$
ERRORI DI PARAMETRI

Passare un valore in virgola mobile ad una procedura che richiede un valore intero - ad esempio, con la procedura proc2:(x%)

ErratoCorretto
2*6+proc2:(PI) 2*6+proc2:(INT(PI))

Questo può succedere anche quando una procedura e chiamata dalla calcolatrice; così, ad esempio:

ErratoCorretto
Calc:proc2:(3) Calc:proc2:(INT(3))

Passare un valore intero a una procedura che richiede un valore in virgola mobile - ad esempio, con la procedura proc3:(x)

ErratoCorretto
proc1:
.
.
proc3:(2/3)
proc1:
.
.
proc3:(2.0/3)

Passare ad una procedura un numero di parametri errato -ad esempio, con la procedura proc4:(x,y)

ErratoCorretto
proc1:
.
.
proc4:(3.7)
proc1:
.
.
proc4:(3.7,2.5)
ERRORE OVERFLOW DI NUMERI INTERI

L'Opl accetta per le variabili intere solo valori compresi tra -32768 e +32767, pertanto, ogni espressione che superi questi limiti dà origine ad un errore.

ErratoCorretto
proc1:
LOCAL a%
a%=100*2468
proc1:
LOCAL a
a=100.0*2468
ERRORI DI STRUTTURA

Le strutture accettate dall'OPL sono DO/UNTIL, WHlLE/ENDWH e IF/ELSEIF/ELSE/ENDIF. Esse possono essere annidate una dentro l'altra, fino ad 8 livelli. Un tentativo di annidare ad un livello superiore dà luogo ad errore. Anche il mescolare le tre strutture, per esempio, chiudendo un DO con un WHILE dà un errore.

ErratoCorretto
proc1:
.
DO
.
WHILE a<2
proc1:
.
DO
.
UNTIL a>=2

ERRORI IN FASE DI ESECUZIONE

Se durante l'esecuzione di un programma si verifica un errore, il programma si ferma ed un messaggio d'errore viene visualizzato.

Se stavate eseguendo la procedura dal menu principale, basta premere SPACE per tornare al menu.

Se invece, stavate operando dal menu Prog, allora avete la possibilità di editare la procedura. Nell'esempio che segue si è invocata una procedura chiamata subproc: che non esiste:

PROC MANCANTE   SUBPROC   .................... Edita A:MAINPROC S/N

Se volete editare le procedura, premete S. Se il programma sorgente è disponibile, siete rimandati all'editor dell'OPL per correggere la riga sbagliata. Se invece non volete eseguire la correzione, premete N oppure ON/CLEAR.

Fatto ciò, premete MODE per passare al menu dell'editor ed, eventualmente, compilare, salvare od abbandonare la procedura. Se l'abbandonate, tutte le correzioni che avete fatto andranno perdute.

INTRAPPOLAMENTO DEGLI ERRORI

Nel caso degli errori in fase di esecuzione sopra descritti, il programma siferma per consentire le visualizzazione del messaggio d'errore. È possibile, però, evitare tutto questo intrappolando gli errori e gestendoli dal programma: questo vi dà un controllo completo, ma deve essere utilizzato con grande cura. Gli strumenti per l'intrappolamento e la gestione degli errori sono: ONERR, TRAP, ERR, ERR$ e RAISE:

ONERR label:: e ONERR OFF

ONERR è usato per passare il controllo, in caso di errore, ad un'etichetta. È molto utile se volete usare una vostra routine per la gestione dell'errore: ad esempio, stampare un messaggio relativo ad un errore che avete previsto. ONERR deve essere seguito da un'etichetta, a sua volta seguite da un doppio "due punti" (::). L'etichetta può essere contenuta nella procedura o in una procedura precedente facente parte del programma.

Nell'esempio che segue, LPRINT è utilizzata per stampare su una stampante collegata. Di regola, se la stampante non è collegata, viene visualizzato il messaggio DISP INESISTENTE. Nel nostro esempio, un messaggio più preciso, CONNECT PRINTER, è stato previsto dal programmatore.

ONERR: noprint:: LPRINT "Dear Sir" RETURN noprint:: ONERR OFF :IF ERR=194 :RAISE ERR :ENDIF PRINT "CONNECT PRINTER" GET

In caso di errore, la prima riga della procedura passa il controllo all'etichetta noprint::. Se nessuna stampante è collegata, l'istruzione LPRINT dà luogo ad un salto ed il messaggio "CONNECT PRINTER" viene visualizzato. Se invece, la stampante è collegata, viene stampanto "Dear Sir", e le istruzioni che seguono l'etichetta non vengono eseguite perchè precedute da RETURN.

L'ISTRUZIONE "ONERR OFF"

Osservate che la prima istruzione dopo l'etichetta noprint:: è ONERR OFF. Questa istruzione è molto importante: infatti se non operate in questo modo dopo che il comando dell'etichetta:: ONERR è stato usato, tutti i successivi errori di programma - persino quelli delle altre procedure chiamate - faranno sì che il programma venga dirottato alla stessa etichetta. Lo schema che segue mostra come due errori completamente diversi causano un salto sulla stessa etichetta e fanno sì che venga stampato lo stesso messaggio esplicativo:

proc1: onerr label:: .... a=log(-1) .... label:: PRINT "Explanation of log error" .... proc2: .... proc3: PRINT 2/0

RISCHI NELL'USO DI ONERR

Poichè tutti gli errori, a meno che non azionate ONERR OFF, rimandano alla stessa etichetta, è molto facile creare, per errore, un ciclo senza fine. Se ciò accade, non potete premere ON/CLEAR e A per interrompere, perché ciò farebbe tornare il controllo all'etichetta come qualsiasi altro errore; dovete quindi togliere le batteria dall'Organiser e perdere tutto ciò che è contenuto nella memoria interna. Per evitare ciò:

Dovreste sempre includere il comando ONERR OFF immediatamente dopo l'etichetta.

TRAP

TRAP intrappola errori solo su un comando specificato; non è quindi necessario cancellarlo come si dovrebbe fare con ONERR. TRAP può essere usato con uno qualunque del comandi elencati qui sotto:

APPEND BACK CLOSE
COPY COPYW CREATE
DELETE DELETEW   ERASE
EDIT FIRST INPUT
LAST NEXT OPEN
POSITION   RENAME UPDATE
USE

Il comando trap deve precedere immediatamente ognuno di questi comandi e essere separato da questi da uno spazio. Per esempio:

TRAP INPUT a%

Quando si usa INPUT senza TRAP e una stringa di testo viene inserita quando, in realtà, è richiesto un numero, lo schermo viene fatto scorrere verso l'alto e appare un punto di domanda che richiede un'altra immissione, questa volta corretta. Quando mettete TRAP davanti a INPUT, il comando viene eseguito nel solito modo, ma se si verifica un errore, la riga successiva dei programma viene eseguita come se l'errore non esistesse. Nell'esempio sottostante la riga successiva è un messaggio di aiuto.

proc: LOCAL a% start:: PRINT "ENTER AGE", TRAP INPUT a% IF ERR=252 PRINT "NUMBER NOT WORD" GOTO start:: ENDIF

Questo esempio fa anche uso della funzione ERR.

LA FUNZIONE ERR

Quando in un programma si verifica un errore, il numero dell'errore è accessibile mediante l'uso della funzione ERR. Ciò significa che potete essere assolutamente sicuri di qual'è l'errore col quale avete a che fare.

L'errore anticipato nell'esempio sottostante è 246 (NO PACK). Se l'errore 246 si verifica quando state tentando di aprire il menu MAIN sui pack B:, viene stampato un utile messaggio di errore. Comunque, in caso si verificasse un errore diverso, la riga successiva vi assicura che verrà stampato il messaggio d'errore standard per quell'errore.

TRAP OPEN "B:MAIN",A,a$ IF ERR=246 PRINT "NO PACK IN B:" ELSEIF ERR PRINT ERR$(ERR) ENDIF

Nell'Appendice D troverete i messaggi d'errore dell'OPL.

RAISE

Se state usando i comandi per intrappolare e gestire gli errori, a un certo punto dello sviluppo del vostro programma potreste dovere controllare le routine di gestione dell'errore. Un modo facile parlare ciò è l'uso del comando RAISE. Potete generare l'errore che ritenete possa probabilmente verificarsi durante l'esecuzione di un programma e vedere se la routine di gestione degli errori opera nella maniera da voi prevista. Per esempio, questa istruzione genera l'errore NO PACK:

RAISE 246


8 PROGRAMMI ESEMPIO

Questo capitolo contiene dei programmi esempio scritti in OPL. Questi programmi non hanno la pretesa di illustrare tutte le possibilità dell'OPL dovrebbero, però, potervene dare un'idea. Per saperne di più su un particolare comando o su una particolare funzione, andate al Capitolo 9.

Ogni procedure deve essere caricata separatamente; non è possibile caricare due procedure assieme. Il Capitolo 1 vi spiega come battere, tradurre, salvare ed eseguire una procedura.

LETTERE MAIUSCOLE, LETTERE MINUSCOLE

In questo manuale, nei listati le variabili sono in lettere minuscole, le funzioni e i comandi, invece, sono in lettere maiuscole. Non è, pero, importante quale delle due forme usate quando caricate una procedura nell'Organiser:

Spazi

State attenti a battere gli spazi necessari:

COMMENTI

Le righe che cominciano col comando REM sono commenti e sono utilizzate per fornire spiegazioni. Non influenzano l'esecuzione di una procedura e non siete obbligati a batterle se non volete.

1 GIORNI (VERSIONE 1)

Questa procedure calcola da quanti giorni siete al mondo. Sostituite la vostra data di nascita a quella riportata nell'esempio.

days1: LOCAL birth%,now%,answer% birth%=DAYS(14,6,1975) now%=DAYS(DAY,MONTH,YEAR) answer%=now%-birth% PRINT answer% :GET

VARIABILI

birth% è la vostra data di nascita
now% è la data corrente
answer% è la data corrente meno la vostra data di nascita.

LE FUNZIONI DATA

Tutte le funzioni data dell'OPL restituiscono valori ottenuti dell'orologio e dal calendario dell'Organiser. La funzione DAYS restituisce il numero di giorni a partire da una data particolare.

2 GIORNI (VERSIONE 2)

Questa è una procedura più flessibile: essa fornisce il numero di giorni che intercorrono tra due date qualsiasi che avete indicato. Quando eseguite la procedura. Vi viene chiesto di inserire il giorno, il mese e l'anno della prima e della seconda data.

days2: LOCAL d1%,m1%,y1%,d2%,m2%,y2% PRINT "PRIMO GIORNO" INPUT d1% PRINT "PRIMO MESE" INPUT m1% PRINT "PRIMO ANNO" INPUT y1% PRINT "SECONDO GIORNO" INPUT d2% PRINT "SECONDO MESE" INPUT m2% PRINT "SECONDO ANNO" INPUT y2% PRINT DAYS(d2%,m2%,y2%)-DAYS(d1%,m1%,y1%) GET

LE VARIABILI

d1%, m1% e y1% sono il giorno, il mese e l'anno della prima data.
d2%, m2% e y2% sono il giorno, il mese e l'anno della seconda data.

3 DADI

Questa procedura trasforma l'Organiser in un dado. Quando il programma viene eseguito, viene visualizzato un messaggio che dice che il dado sia rotolando. Premete S per fermarlo. Viene visualizzato un numero casuale da uno a sei e voi potete decidere se gettarlo di nuovo o no.

dice: LOCAL dice%,key% KSTAT 1 top:: CLS :PRINT "****IL DADO GIRA****" PRINT "PREMI S PER STOP" DO dice%=(RND*6+1) UNTIL KEY$="S" CLS PRINT "********* ";dice%;" ********" BEEP 50,100 AT 1,4 :PRINT "GIRA ANCORA S/N" label:: key%=GET IF key%=%S GOTO top:: ELSEIF key%=%N RETURN ELSE GOTO label:: ENDIF

LE VARIABILI

dice% è un numero casuale compreso tra 1 e 6.
key% è il valore ASCII corrispondente al tasto premuto e letto dalla funzione GET.

INUMERI CASUALI

Questo è il modo col quale dice: visualizza in maniera casuale i numeri 1, 2, 3, 4, 5 e 6. La funzione RND restituisce un numero casuale a virgola mobile compreso fra 0 e 1 (1 escluso). Esso viene quindi moltiplicato per 6 e sommato a 1 (in modo da ottenere numeri che vanno da 1 a 6 invece che da 0 a 5). L'arrotondato per difetto è ottenuto assegnandolo all'intero dice%.

IDENTIFICAZIONE DI S E DI N

La funzione GET restituisce il valore ASCII del carattere corrispondente al tasto che premuto assegnandolo alla variabile k%. In OPL si può ottenere il valore ASCII di qualsiasi carattere premettendo gli %; così, %S è il valore ASCII di S ed %N è il valore Ascii di N. All'inizio della procedura, si impostano le maiuscole con KSTAT 1 per evitare che, nel caso la vostra tastiera fosse impostata sulle minuscole, invece di S ed N battiate s ed n.

4 MUTUO

Questo programma calcola i pagamenti mensili di un mutuo. Quando mandate in esecuzione questo programma, dovete inserire l'ammontare del prestito, il tasso d'interesse e la durata in anni. Dovete poi specificare l'origine del prestito selezionando dal menu. Il programma non permette la detrazione delle tasse.

Il programma è costituito da due procedure - mutuo: e q: - una routine di input. Dovete caricarle separatamente. La routine di input può essere utilizzata da qualsiasi altra procedura che necessiti di suggerire all'utilizzatore di inserire un numero a virgola mobile.

mutuo: LOCAL num%,loan,x,term,rate,pay,ques$(2) CLS PRINT "EVALUATE MONTHLY" PRINT "MORTGAGE PAYMENT" PAUSE 30 ques$=CHR$(63)+" " REM CHR$(63) is a "?" - See Appendix A loan=q:("ENTER LOAN"+ques$) DO rate=q:("INTEREST RATE % "+ques$) UNTIL rate>0 AND rate<99 DO term=q:("ENTER TERM (YRS)"+ques$) UNTIL term>.5 AND term<100 num%=MENU("BUILDING-SOCIETY,BANK,OTHER") IF num%=0 :RETURN :ENDIF rate=rate/100 :x=1+11*(num%/2) pay=loan*rate/12/(1-((1+rate/x)**(-x*term))) CLS :PRINT "MONTHLY PAYMENT" PRINT FIX$(pay, 2, -8) GET RETURN

q:(a$) LOCAL z CLS :PRINT a$,CHR$(16); INPUT z CLS RETURN(z)

LE VARIABILI

loan, term, rate, e pay sono rispettivamente l'ammontare dal prestito, la durata in anni, il tasso d'interesse e i pagamenti mensili.
ques$ è "?"
num% è il numero della voce del menu scelta.
x è una variabile usata nel calcolo finale.
z è la variabile usate per i valori che inserite quando q: è in fase di esecuzione.

CHIAMARE q:

La procedura principale mutuo chiama q: tre volte, passando una stringa che deve essere stampare come suggerimento. La stringa è passata a q: come parametro. I valori restituiti sono assegnati alle variabili prestito, tasso e durata.

COME "?" VIENE STAMPATO

La funzione CHR$ converte il valore ASCII 63 in un punto di domanda.

COME SEGNALA LA ROUTINE DI INPUT

La funzione CHR$ converte il valore 16 nel carattere che controlla la segnalazione acustica. Esso viene poi "stampato".

5 IL GIOCO DELLA CACCIA

Le due procedure che seguono costituiscono un gioco che mostra l'uso della grafica definita dall'utente (UDG's). Ogni procedura deve essere caricata separatamente. Lo scopo del gioco è evitare di essere catturati dagli inseguitori. Il vostro uomo, che può muoversi, può saltare su e giù: premere il tasto X per saltare verso il basso e il tasto S per saltare verso l'alto. Alla fine del gioco il vostro punteggio verrà visualizzato sullo schermo.

Per interrompere il gioco premete ON/CLEAR; per riprendere premete lo nuovamente. Per uscire dal gioco premere ON/CLEAR e, quindi, A.

gioco: LOCAL e$(2) LOCAL a%,b%,b1%,c%,c1%,x%,y%,i%,sc% graphic: :CURSOR OFF e$=CHR$(4)+CHR$(6) b%=20 :c%=12 :x%=3 :y%=1 DO CLS :PRINT REPT$(CHR$(158),80) AT x%,y% :PRINT CHR$(7) a%=1 :c%=1+RND*4 DO :c1%=1+RND*4 :UNTIL c%<>c1% DO AT a%,c% :PRINT CHR$(0) AT a%,c1% :PRINT CHR$(0) :BEEP b%,10*b% AT a%,c% :PRINT CHR$(1) AT a%,c1% :PRINT CHR$(1) :BEEP b%,10*b% AT a%,c% :PRINT CHR$(2) AT a%,c1% :PRINT CHR$(2) :BEEP b%,10*b% AT a%,c% :PRINT CHR$(3) AT a%,c1% :PRINT CHR$(3) :BEEP b%,10*b% AT a%,c% :PRINT e$ AT a%,c1% :PRINT e$ :BEEP b%,10*b% AT a%,c% :PRINT CHR$(5) AT a%,c1% :PRINT CHR$(5) :BEEP b%,10*b% AT a%,c% :PRINT " " :AT a%,c1% :PRINT " " i%=KEY IF i% IF i%=%S AND y%>1 AT x%,y% :PRINT CHR$(158) y%=y%-1 :AT x%,y% :PRINT CHR$(7) ENDIF IF i%=%X AND y%<4 AT x%,y% :PRINT CHR$(158) y%=y%+1 :AT x%,y% :PRINT CHR$(7) ENDIF ENDIF a%=a%+1 IF a%=x% AND (c%=y% OR c1%=y%) :REM Hit i%=0 DO AT x%,y% :PRINT CHR$(170+i%) BEEP 10,100+i% i%=i%+1 BEEP 10,100-i% UNTIL i%=30 b%=b%+5 :a%=20 :x%=x%+2 IF x%>20 CLS :PRINT "GAME OVER" PRINT "SCORE:",sc% :PAUSE 40 WHILE KEY :ENDWH :REM Drain buffer GET :RETURN ENDIF ENDIF UNTIL a%=20 sc%=sc%+1 IF b%>12 b%=b%-2 ELSEIF b%<6 IF b1% b%=b%-1 :b1%=0 ELSE b1%=1 ENDIF ELSE b%=b%-1 ENDIF UNTIL 0

graphic: UDG 0,0,0,28,30,30,30,28,0 UDG 1,0,0,14,31,30,31,14,0 UDG 2,0,0,7,14,12,14,7,0 UDG 3,0,0,3,7,6,7,3,0 UDG 4,0,0,1,3,3,1,0,0 UDG 5,0,0,0,1,1,1,0,0 UDG 6,0,0,24,16,4,16,24,0 UDG 7,30,14,4,14,30,14,11,25

LA GRAFICA DEFINITA DALL'UTENTE

La procedura principale, gioco:, chiama graphic: che, quindi, usa il comando UDG 8 volte per impostare i caratteri grafici usati nel gioco. L'ultimo comando UDG è quello che imposta l'omino. Nell'Appendice A vengono spiegati i caratteri definiti dall'utente.

6 PROCEDURE DI GESTIONE DI FILE DATI

La procedura principale che vi mostriamo ora crea sul dispositivo A: un file dati chiamato addr destinato a contenere nomi, indirizzi, codici postali e numeri telefonici. Seguono altre 4 procedure che vi permettono di inserire, cercare, alterare e cancellare record nel file. Quando file: viene mandata in esecuzione, viene visualizzato un menu che vi permette di scegliere fra le varie opzioni.

Ognuna di queste 5 procedure deve essere caricata separatamente.

files: LOCAL m% IF NOT EXIST("A:addr") CREATE "A:ADDR",A,n$,ad1$,ad2$,ad3$,pc$,tel$ ELSE OPEN " A:ADDR",A,n$,ad1$,ad2$,ad3$,pc$,tel$ ENDIF DO m%=MENU("INSERT,SEARCH,ALTER,ERASE,QUIT") IF m%=0 or m%=5 :STOP ELSEIF m%=1 :insert: ELSEIF m%=2 :search: ELSEIF m%=3 :alter: ELSEIF m%=4 :erase: ENDIF UNTIL 0 :REM do loop forever

insert: PRINT "ENTER NAME" :INPUT A.n$ CLS :PRINT "ENTER STREET" :INPUT A.ad1$ CLS :PRINT "ENTER TOWN" :INPUT A.ad2$ CLS :PRINT "ENTER COUNTY" :INPUT A.ad3$ CLS :PRINT "ENTER PCODE" :INPUT A.pc$ CLS :PRINT "ENTER TELNUM" :INPUT A.tel$ APPEND

search: LOCAL recnum%,search$(30) top:: FIRST :CLS :PRINT "FIND:"; TRAP INPUT search$ IF ERR=206 RETURN ENDIF recnum%=FIND(search$) IF recnum%=0 CLS :PRINT "NOT FOUND" :PAUSE 20 GOTO top:: ENDIF DO DISP(-1,"") :NEXT :recnum%=FIND(search$) IF recnum%=0 :CLS PRINT " NO MORE ENTRIES" PAUSE 20 :RETURN ENDIF UNTIL 0

alter: LOCAL recnum%,search$(30),k% DO FIRST :CLS PRINT "ALTER:"; :TRAP INPUT search$ IF ERR=206 :RETURN :ENDIF recnum%=FIND(search$) IF recnum%=0 CLS :PRINT "NOT FOUND" PAUSE 20 :CONTINUE ENDIF DO KSTAT 1 :CLS :AT 1,2 :PRINT "EDIT Y/N" k%=VIEW(1,A.n$) IF k%=%Y :CLS EDIT A.n$ :EDIT A.ad1$ EDIT A.ad2$ :EDIT A.ad3$ EDIT A.pc$ :EDIT A.tel$ :UPDATE :RETURN ELSEIF k%=%N :NEXT :recnum%=FIND(search$) IF recnum%=0 CLS :PRINT "NOT FOUND" :PAUSE 20 :BREAK ENDIF ENDIF UNTIL 0 UNTIL 0

erase: LOCAL recnum%,search$(30),k% FIRST :CLS :PRINT "ERASE:"; TRAP INPUT search$ IF ERR=206 :RETURN :ENDIF recnum%=FIND(search$) DO IF recnum%=0 CLS :PRINT "NOT FOUND" :PAUSE 20 :RETURN ENDIF ask:: KSTAT 1 :AT 1,2 :PRINT "ERASE Y/N" k%=VIEW(1,A.n$) IF k%<>%Y AND k%<>%N GOTO ask:: ELSEIF k%=%Y ERASE ELSEIF k%=%N NEXT :recnum%=FIND(search$) ENDIF UNTIL EOF

VARIABILI

m% è il numero della voce del menu selezionata.
recnum% è il numero del record restituito da FIND.
search$ è la chiave di ricerca data.
k% è il valore ASCII del tasto che premete mentre viene visualizzato il record trovato. (%Y è il valore ASCII di Y, %N è il valore ASCII di N).

CREAZIONE DEL FILE DATI

La prima procedura, files:, crea o apre sul dispositivo A: un file chiamato addr con sei campi per ogni record. I nomi dei sei campi sono n$ per il nome, ad1$, ad2$ e ad3$ per ogni riga dell'indirizzo, pc$ per il codice postale e tel$ per il numero telefonico. Al file viene assegnato il nome logico A.

INSERIMENTO DEI RECORD

Osservate come in insert: i sei campi del record sono inseriti uno per uno. I nomi dei campi vengono usati come variabili e sono preceduti dal nome logico del file (A) e un punto (.). Quindi si usa il comando APPEND. Ciò è necessario per poter realmente aggiungere il record alla fina del file.

VISUALIZZAZIONE DEL RECORD CORRENTE

Quando un record contenente una particolare stringa è stato trovato da FIND, esso diventa il record corrente. DISP lo visualizza assegnando il valore -1 al primo parametro.

Nella procedura alter:, si usa VIEW per visualizzare proprio il primo campo dei record, mentre decidete se editarlo o no. Se decidete di editarlo, ogni campo viene allora visualizzato dalla funzione EDIT che vi permette di alterare ciò che si trova sullo schermo.

7 TELEFONO (GESTIONE DEI FILE DATI)

X_____________11:19a Logcall Viewcalls  

Queste tre procedure costituiscono un programma che vi permette di tenere la contabilità delle vostre telefonate. Esso immagazzina, in un file, la loro durata ed i vostri commenti. Il programma può essere facilmente adattato per registrare la durata di attività di altro tipo.

La prima procedura visualizza un menu come questo con un telefono stilizzato ed un orologio. Poichè l'orologio usa i grafici definiti dall'utente (UDG) 3,4,5,6,7 e 1, per il telefono e la sottolineatura si sono usati gli UDG 0 e 2:

logger: LOCAL m% UDG 0,31,21,14,10,31,31,0,31 UDG 2,0,0,0,0,0,0,0,31 PRINT CHR$(0);REPT$(CHR$(2),14) CLOCK(1) m%=MENUN(2,"Logcall,Viewcalls") IF m%=0 RETURN ELSEIF m%=1 logcall: ELSE m%=2 viewcall: ENDIF

logcall: LOCAL k%,h%,m%,s%,sec%,start$(8),swof% ESCAPE OFF IF NOT EXIST("A:LOG") CREATE "A:LOG",B,date$,t$,comment$ ELSE OPEN "A:LOG",B,date$,t$,comment$ ENDIF swof%=PEEKB($7C) POKEB $007C,0 :REM no auto turn off B.t$="00:00:00" B.date$=DATIM$ start$=RIGHT$(DATIM$,8) h%=0 :m%=0 :s%=0 :sec%=SECOND DO IF sec%<>SECOND BEEP 1,100 sec%=SECOND :s%=s%+1 IF s%=60 :s%=0 :m%=m%+1 IF m%=60 :m%=0 :h%=h%+1 ENDIF ENDIF B.t$=REPT$("0",-(h%<10))+NUM$(h%,2)+":" B.t$=B.t$+REPT$("0",-(M%<10))+NUM$(m%,2)+ B.t$=B.t$+REPT$("0",-(s%<10))+NUM$(s%,2) ENDIF AT 1,1 :PRINT "Started:";start$ PRINT "Time:";B.t$ PAUSE -1 :REM save battery k%=KEY IF k%=1 GOTO exit:: ENDIF UNTIL k%=13 PRINT "Comments "+CHR$(63) TRAP INPUT B.comment$ IF ERR=206 GOTO exit:: ENDIF CLS :PRINT "Saving" :APPEND exit:: CLOSE POKEB $007C,swof% :REM restore auto turn off ESCAPE ON

viewcall: LOCAL k% TRAP OPEN "A:LOG",B,date$,t$,comment$ IF ERR :RETURN :ENDIF DO k%=DISP (-1,"") NEXT IF k%=1 RETURN ENDIF UNTIL EOF AT 1,4 :PRINT " NO MORE ENTRIES" PAUSE 25 RETURN

LE VARIABILI

k% è usato per i tasti premuti letti da KEY.
sec% è il numero reale di secondi dopo il minuto all'inizio della procedura.
s% sono i secondi visualizzati mentre scorrono.
m% sono i minuti visualizzati mentre scorrono.
h% sono le ore visualizzate mentre scorrono.
start$ è l'ora d'inizio della telefonata.
swof$ à l'impostazione iniziale dell'autospegnimento.

IL FILE

Sul dispositivo A: viene creato un file chiamato LOG con tre campi per record: uno per la data, uno per la durata delle telefonata e uno per i vostri commenti. Quando mandate in esecuzione il programma e registrate una telefonata, la data, la durata e il commento sono aggiunti al file come un nuovo record. Selezionate Viewcalls per scorrere tutti i record aggiunti.

Potreste anche aprire il file A:LOG in Xfile e cercare i record usando Find.

COME IL CRONOMETRO CALCOLA IL TEMPO TRASCORSO

All'inizio, il numero di secondi dopo il minuto viene letto dall'orologio di sistema mediante la funzione SECOND e viene assegnato alla variabile sec%. Si usa quindi di nuovo la funzione SECOND: se il valore restituito non è più uguale a sec% - cioè, quando è passato un secondo - si aggiunge 1 a s% e a sec% viene assegnato il nuovo valore restituito da SECOND. Ogni volta che s% è 60, esso è azzerato e si aggiunge 1 a m% e così via.

USCITA

Normalmente ON/CLEAR crea una pausa durante l'esecuzione di una procedura così che si possa premere A per abbandonare. All'inizio di questa procedura si usa ESCAPE OFF. Ciò significa che ON/CLEAR non origine più una pausa nei programma e, quindi, può essere letto dalle funzioni KEY e DiSP e causare un RETURN al menu PROG invece di un errore ESCAPE.

VISUALIZZAZIONE DEI RECORD

Quando A:LOG viene aperto in Viewcall, il primo record viene reso il corrente e viene, quindi, visualizzato da DISP con -1 come primo parametro. Si usa, poi, NEXT per rendere corrente, a turno, ogni record.

8 PROCEDURA DI GESTIONE DEL FILE AGENDA

Se salvate la vostra agenda su un file, potete usare questo programma per copiare tutti i compleanni da un anno all'altro. Questo programma può essere facilmente adattato anche per altre voci.

Viene aperto un file dell'agenda salvata, chiamato "olddia" e in tutti i record che contengono 1989 e un compleanno 1989 viene cambiato in 1990; i record modificati, infine, sono caricati in un file chiamato "newdia". Potete quindi caricare e fondere "newdia" nella vostra attuale agenda.

Quando battete la procedura, ricordatevi di sostituire ad "olddia" il nome della vostra agenda salvata.

birthday: CREATE "a:newdia",B,date$,text$ OPEN "a:olddia",A,date$,text$ WHILE FINDW("1989*birthday") PRINT a.text$ b.date$="1990"+mid$(a.date$,5,255) b.text$=a.text$ USE B :APPEND USE A :NEXT ENDWH GET

FILE AGENDA

Il file di un'agenda salvata è del tutto uguale ad un qualunque altro file dati. Per avere maggiori informazioni sul formato dei record nei file agenda, comunque, andate al Capitolo 6.


9 COMANDI E FUNZIONI DELL'OPL

SOMMARIO

Quello che segue è un sommario dei comandi e delle funzioni dell'OPL cha ha lo scopo di darvi un'idea di ciò che è disponibile. Il sommario è poi seguito da un elenco, in ordine alfabetico, che tratta in dettaglio ogni funzione e comando.

Un asterisco (*) indica che l'istruzione può essere usata solo su un modello LZ o LZ64 e non su un XP o CM.

Strutture

DO/UNTIL Cicla finchè non è soddisfatta una data condizione
GOTO label:: Salta ad un'etichetta
IF/ELSEIF/ELSE/ENDIF Opera condizionatamente
WHILE/ENDWH Cicla fintanto che è soddisfatta una data condizione
BREAK Esce da un ciclo
CONTINUE Va alla condizione di prova di un ciclo

Comandi generali

AT Posiziona il cursore
BEEP Fa suonare il cicalino
CLS Ripulisce lo schermo
CURSOR ON/OFF Imposta il cursore
EDIT Permette di editare la stringa sullo schermo
ESCAPE ON/OFF Permette all'utente di uscire dal programma
GLOBAL Dichiara una variabile per tutte le procedure chiamate
INPUT Permette di inserire i dati
KSTAT Imposta la testiera
LOCAL Dichiara una variabile solo per la procedura corrente
OFF Spegne l'Organiser
OFF x% Spegne l'Organiser solo per un tempo limitato *
PAUSE Fa una pausa durante l'esecuzione di un programma
PRINT Stampe sullo schermo
LPRINT Stampa su una stampante o su un computer collegati
RANDOMIZE Imposta una nuova sequenza di numeri casuali
REM Precede il commento del programmatore
RETURN Fa tornare alla procedura chiamante
STOP Fa uscire dall'OPL
UDG Definisce un carattere (grafica definita dall'utente)

Comandi di gestione degli errori

ONERR label:: In caso d'errore, salta all'etichetta
ONERR OFF Cancella l'etichetta ONERR label::
RAISE Genera un errore
TRAP Intrappola errori su un comando specifico

Comandi di gestione dei file:

APPEND Aggiunge il campo corrente al file dati corrente
CLOSE Chiude un file dati
COPY Copia un file dati
COPYW Copia qualsiasi tipo di file *
CREATE Crea un file dati
DELETE Cancella un file dati
DELETEW Cancella qualsiasi tipo di file *
ERASE Cancella un record
FlRST/LAST/NEXT/BACK seleziona il primo record, l'ultimo, il successivo od il precedente
OPEN Apre un file dati
POSITION Seleziona un record per via numerica
RENAME Rinomina un file dati
UPDATE Aggiorna un record
USE Cambia il file dati corrente

Comandi per l'indirizzamento della memoria

POKEB Scrive un byte in una locazione
POKEW Scrive un numero intero in due locazioni successive

Funzioni generali

CHR$ Restituisce un carattere col codice ASCII specificato
CLOCK Visualizza l'orologio
FIX$ Restituisce un numero come numero a virgola fissa
FREE Restituisce la quantità di memoria interna disponibile
GEN$ Restituisce un numero come stringa
GET Aspetta che si batta un tasto. Restituisce il valore ASCII del tasto
GET$ Attende che si prema un tasto. Restituisce il tasto coma stringa
KEY Restituisce il valore ASCII del tasto premuto
KEY$ Restituisce il tasto premuto come stringa
NUM$ Restituisce un numero come intero
MENU Visualizza un menu
MENUN Visualizza un menu multi-riga
SPACE Restituisce la quantità di memoria disponibile su un dispositivo
VIEW Visualizza una stringa che scorre sullo schermo

Funzioni per in gestione degli errori

ERR Restituisce il numero dell'errore
ERR$ Restituisce il messaggio d'errore

Funzioni per in gestione di un file

COUNT Restituisce il numero di record presenti in un file dati
DIR$ Fornisce i nomi dei file dati
DIRW$ Fornisce i nomi dei file, qualunque sia il tipo *
DISP Visualizza un record
EOF Controlli per l'identificazione della fine di un file dati
EXIST Controlla l'esistenza di un file dati con un certo nome
FIND Trova un record che contenga una data stringa FINDW Come
FINDW ma permette l'uso dei caratteri jolly *
POS Restituisce il numero del record corrente
RECSIZE Restituisce i bytes occupati del record corrente

Funzioni numeriche

ABS Restituisce i valore assoluto (senza segno) di un numero a virgola mobile
ACOS Restituisce l'arcocoseno di un numero *
ASIN Restituisce l'arcoseno di un numero *
ATAN Restituisce l'arcotangente di un numero
COS Restituisce il coseno di un angolo
DEG Converte i radianti in gradi
EXP Restituisce e elevato alla potenza specificata
FLT Converte un intero in un numero a virgola mobile
IABS Restituisce il valore assoluto (senza segno) di un intero
INT Restituisce un numero intero arrotondato per difetto
INTF Come sopra, ma restituisce un numero a virgola mobile
LN Restituisce il logaritmo naturale di un numero
LOG Restituisce il logaritmo in base 10 di un numero
PI Restituisce il valore di Pigreco (3.1415926535)
RAD Converte i gradi in radianti
RND Restituisce un numero casuale come numero a virgola mobile
SIN Restituisce il seno di un angolo
SQR Restituisce la radice quadrata di un numero
TAN Restituisce la tangente di un angolo
HEX$ Converte un intero in una stringa esadecimale

Altre funzioni numeriche *

MAX Restituisce il valore maggiore
MIN Restituisce il valore minore
MEAN Restituisce la media
STD Restituisce la deviazione standard
SUM Restituisce la somma
VAR Restituisce la varianza

Funzioni data

DAYS Restituisce il numero di giorni a partire dal 01/01/1900 usato per trovare il numero di giorni che intercorrono fra due date *
DATIM$ Restituisce la data e l'ora come stringa
DAYNAME$ Converte i numeri da 1 e 7 nel giorno dalla settimana *
DOW Restituisce i giorno su cui cade una data come numero da 1 a 7 *
MONTH$ Converte i numeri da 1 a 12 nel mese *
SECOND/MINUTE/HOUR/DAY/MONTH/YEAR Restituisce informazioni riguardo l'ora e la data correnti
WEEK Restituisce il numero della settimana in cui cade una data *

Funzioni perla gestione di stringhe

ASC Restituisce il valore ASCII del primo carattere di una stringa
LEFT$/MID$/RIGHT$ Seleziona i caratteri da una stringa a seconda della posizione
LEN Restituisce la lunghezza di una stringa
LOC Restituisce la posizione di una stringa entro un'altra stringa
LOWER$/UPPER$ Converte una stringa in lettere maiuscole o minuscole
REPT$ Restituisce ripetizioni di una stringa specificata
VAL Converte una stringa numerica in un numero a virgola mobile

Funzioni per l'indirizzamento della memoria

ADDR Restituisce la locazione di una variabile
PEEKB Restituisce il valore memorizzato in una data locazione
PEEKW Restituisce il valore memorizzato in due locazioni successive

Funzioni del microprocessore

USR Passa valori al microprocessore e restituisce un intero
USR$ Passa valori al microprocessore e restituisce una stringa

SINTASSI DEI COMANDI

La maggior parte del comandi OPL richiedono uno o più argomenti. Questi possono essere valori letterali o variabili.

Per specificare la sintassi di un comando, si usa il seguente metodo:

xEspressione numerica, variabile o letterale. Per esempio prezzo o 49.99
x%Espressione intera che va da -32768 a +32767, variabile o letterale. Per esempio prezzo% o 50
a$Stringa, variabile o letterale. Per esempio prezzo$ o "49.99"
dev:Dispositivo (A:, B: o C:)
logNome logico del file (A, B, C o D)

SINTASSI DELLE FUNZIONI

Le funzioni sono utilizzata per produrre valori che possono poi essere assegnati a una variabile o combinati con comandi come PRINT. Per esempio:

L'istruzione y%=YEAR assegna alla variabile y% il valore intero 1990 (o qualunque sia l'anno corrente).
L'istruzione PRINT YEAR visualizza sullo schermo il numero 1990.

Il metodo per specificare la sintassi è come quello usato per i comandi.

Il tipo del valore restituito dalia funzione è definito dal tipo della variabile che lo riceve:

Le funzioni numeriche che restituiscono un valore a virgola mobile si presentano così: f=FUNCTION.
Le funzioni numeriche che restituiscono un intero si presentano così: f%=FUNCTION.
Le funzioni di stringa si presentano così: f$=FUNCTION$.

ELENCO DEI COMANDI E DELLE FUNZIONI

ABS
Sintassi: a=ABS(x)
Restituisce il valore assoluto, cioè senza segno, di un numero a virgola mobile. Per esempio: ABS(-10) è 10.
Vedi anche IABS

ACOS
Sintassi: a=ACOS(x)
Restituisce l'arcocoseno dell'espressione tra parentesi.

ADDR
Sintassi: a%=ADDR(var)
Restituisce l'indirizzo della locazione di memoria in cui è stata caricata la variabile tra parentesi. La variabile può anche essere una variabile a schiera, ad esempio A%=ADDR(ARRAY()), ma non è possibile specificare i singoli elementi delle schiera.

APPEND
Sintassi: APPEND
Aggiunge i valori del campo corrente alla fine del file corrente come un nuovo record.
Vedi anche UPDATE

ASC
Sintassi: a%=ASC(a$)
Restituisce il valore ASCII del primo carattere di una stringa. Per esempio A%=ASC("hello") restituisce 104. Vedi l'Appendice A per i codici ASCII. Se si vuol conoscere il codice ASCII di un particolare carattere si può usare il segno %. Per esempio, A%=%G restituisce in A% il codice ASCII del carattere G.

ASIN
Sintassi: a=ASIN(x)
Restituisce l'arcoseno dell'espressione tra parentesi.

AT
Sintassi: AT x%,y%
Piazza il cursore in una posizione dello schermo specificata. x% è il numero posizioni sullo schermo che vanno da 1 a 20 e y% (1, 2, 3 o 4) indica la riga, rispettivamente, quella in alto, la seconda, la terze e quella in basso.

ATAN
Sintassi: a=ATAN(x)
Restituisce l'arcotangente dell'espressione tra parentesi.

BACK
Sintassi: BACK
Rende record corrente il record precedente del file data corrente. Se il record corrente è il primo record, allora il record corrente non cambia.

BEEP
Sintassi: BEEP x%,y%
Fa suonare un cicalino all'interno dell'Organiser. La durata del suono è x% millisecondi. La frequenza del suono è determinata dall'equazione:
{Frequenza = 921600/(78+2*y%) Hz}
Per far suonare il cicalino si può anche usare il carattere di controllo 16 col comando PRINT e la funzione CHR$, per esempio: PRINT CHR$(16)

BREAK
Sintassi: BREAK
Permette in un programma di uscire da un ciclo DO/UNTIL o WHILE/ENDWH e di continuare l'esecuzione del programma a partire dall'istruzione che segue la chiusura del ciclo (UNTIL o ENDWH).

CHR$
Sintassi: c$=CHR$(x%)
Restituisce il carattere ASCII corrispondente al valore dell'espressione tra parentesi. Può essere usato per stampare caratteri non disponibili sulla tastiera - per esempio, l'istruzione PRINT CHR$(63) stampa un punto di domanda. Per maggiori informazioni, vedere l'Appendice A.

CLOCK
Sintassi: c%=CLOCK(x%)
Questa funzione visualizza l'orologio, sempre aggiornato, nell'angolo in alto e destra dello schermo. x% può essere 0 o 1:

0Orologio non visualizzato o se CLOCK(1) è stato già usato, non è aggiornato.
1Orologio visualizzato.
Restituisce la precedente situazione dell'orologio (0 o 1).

CLOSE
Sintassi: CLOSE
Chiude il file corrente.
Vedi anche OPEN, CREATE, DELETE, USE.

CLS
Sintassi: CLS
Pulisce lo schermo e riporta il cursore all'inizio della prima riga.

CONTINUE
Sintassi: CONTINUE
Restituisce il controllo dei programma all'espressione di controllo di un ciclo DO/UNTIL o WHILE/ENDWH. Per esempio:

DO <statement list> IF x=y CONTINUE ENDIF <statement list> UNTIL a=b

In questo esempio, il comando CONTINUE verrà eseguito se l'espressione che segue IF è vera. Se ciò accade, il controllo dei programma sarà allora trasferito al controllo di UNTIL.

COPY

Sintassi: COPY "dev1:fname1","dev2:fname2" COPY "dev1:fname1","dev2:" COPY "dev1:","dev2:"
Copia i file dati da un dispositivo ad un altro. Vi sono tre possibili varianti:

1 Nei primo esempio un file dati su un dispositivo viene copiato su un altro dispositivo con un nome di file diverso. Un esempio potrebbe essere:
COPY "A:CLIENTS","B:CLIENT88"
Se sul dispositivo di destinazione vi è già un file col nome fname2, allora i record del file che viene copiato, sono aggiunti ad esso. In caso diverso si crea un nuovo file con quel nome e i record vengono scritti su di esso.

2 Nel secondo esempio, il nome del file sul dispositivo di destinazione è uguale a quello sul dispositivo d'origine.

3 Nel terzo esempio, tutti i file sul dispositivo d'origine sono copiati, inalterati, sul dispositivo di destinazione.

COPYW

Sintassi: COPYW "dev1:fname1.ext","dev2:fname2" COPYW "dev1:fname1.ext","dev2:" COPYW "dev1:*.*","dev2:"
Copia qualunque tipo di file da un dispositivo ad un altro. Le tre varianti sono le stesse di COPY tranne il fatto che si devono usare le estensioni per indicare il tipo di file. Si possono anche usare caratteri jolly. Se il primo nome contiene caratteri jolly, il secondo nome deve essere solo quello del dispositivo. Per esempio, per copiare tutti i notepad da B: a C: COPYW "B:*.NTS","C:".
Si deve o specificare l'estensione o aggiungere. * al primo nome, cosi per copiare da A: a B: tutti i file di qualunque tipo i cui nomi finiscano in 8: COPY "A:*8.*","B:". Le estensioni si trovano nel capitolo 6.

COS
Sintassi: c=COS(x)
Restituisce il coseno dell'espressione tra parentesi. L'espressione rappresenta un angolo espresso in radianti.

COUNT
Sintassi: c%=COUNT
Restituisce il numero di record nel file corrente.
Vedi anche POS, POSITION.

CREATE
Sintassi: CREATE "dev:fname",log,fld1,fld2
Crea un file dati sul dispositivo dev:, col nome fname, il nome logico dei file log, a fino a 16 campi come specificato da fld1, fld2 eccetera. Si usa il nome logico del file (A, B, C o D) per riferirsi a questo file all'interno del programma. Ogni file viene aperto automaticamente e possono essere aperti fino a 4 file contemporaneamente.
Un esempio dei contando potrebbe essere:
CREATE "A:CLIENTS",B,NAME$,PHONE$,ADDRESS$
In questo esempio i file è creato sul dispositivo A: col nome clients e i nome logico B. In questo file, ogni record può avere fino a tre campi.
Vedi anche OPEN, CLOSE, DELETE, USE.

CURSOR ON/OFF
Sintassi: CURSOR ON e CURSOR OFF
Accende o spegne il cursore. Il valore di default è CURSOR OFF.

DATIM$
Sintassi: d$=DATIM$
Restituisce come stringa la data e l'ora ricavandole dall'orologio dei sistema; per esempio: "MON 16 OCT 1989 16:25:30".
Vedere anche SECOND, MINUTE, HOUR, DAY, MONTH, YEAR.

DAY
Sintassi: d%=DAY
Restituisce il giorno del mese (da 1 a 31).
Vedere anche SECOND, MINUTE, HOUR, MONTH, YEAR, DATIM$.

DAYNAME$
Sintassi: d%=DAYNAME$(x%)
Converte il numero x%, da 1 a 7, nel giorno della settimana. Ad esempio: d$=DAYNAME$(1) restituisce MON.
Vedere anche DOW.

DAYS
Sintassi: d%=DAYS(day%,month%,year%)
Restituisce il numero del giorno a partire dall' 1-1-1900. Questo può essere utilizzato, mediante una sottrazione, per determinare il numero di giorni che intercorrono tra due date. Per esempio:

x%=DAYS(1,1,1989) y%=DAYS(DAY,MONTH,YEAR) z%=y%-x%

DEG
Sintassi: d=DEG(x)
Converte i radianti in gradi. Restituisce il valore in gradi dell'angolo, misurato in radianti, rappresentato dell'espressione tra parentesi.
Vedere anche RAD.

DELETE
Sintassi: DELETE "dev:fname"
Cancella dal dispositivo dev: il file dati di nome fname. Per esempio: DELETE "B:CLIENTS". Quando il comando viene dato il file deve risultare chiuso.
Vedere anche CREATE, OPEN, CLOSE, USE.

DELETEW
Sintassi: DELETEW "dev:fname.ext"
Cancella dal dispositivo dev: il file di nome fname e di un determinato tipo. La sintassi è identica a quella di DELETE coll'eccezione che si deve aggiungere l'estensione che indica il tipo del file. È possibile usare anche caratteri jolly. Per esempio, per cancellare tutti i file blocknotes presenti sul dispositivo C:,
DELETEW "C:*.NTS"
Per maggiori dettagli sull'estensione dei file, vedere il Capitolo 6.
Dato che DELETEW è un comando estremamente potente, tutti i file debbono essere chiusi quando esso viene usato; se i file non sono chiusi, il comando li chiude automaticamente.

DIR$

Sintassi: d$=DIR$("dev")
d$=DIR$("")
Restituisce il nome di un file dati.

1 DIR$("dev") restituisce il nome del primo file dati presente sul dispositivo specificato. I nomi dei dispositivi (A, B o C) debbono essere posti tra virgolette e tra parentesi. Per esempio: D$= DIR$("A").

2 L'uso ripetuto di questa funzione con una stringa nulla tra parentesi, restituisce i file che seguono su quel dispositivo. Quando non ve ne sono più, viene restituita una stringa nulla.

DIRW$

Sintassi: d$=DIRW$("dev:fname.ext"')
d$=DIRW$("")
Restituisce il nome di un dato tipo di file. Opera come DIR$, ma richiede che sia specificato oltre al dispositivo anche il nome e l'estensione del file. È possibile utilizzare caratteri jolly. Per esempio: per avere il nome del primo biocknotes su B:
D$=DIRW$("B:*.NTS").
Per maggiori informazioni sull'estensione del file, vedere il Capitolo 6.

DISP
Sintassi: d%=DISP(x%,a$)
Visualizza una stringa o un record a seconda del valore di x%. Il valore di x% può essere: -1, 0, 1.

Se x% è -1 a$ è ignorato e il record corrente è visualizzato, un campo per linea. I tasti cursore possono essere utilizzati per muoversi lungo il record.

Se x% è 1 a$ è visualizzato come sopra. Se a% contiene i caratteri di tabulazione (carattere ASCII 9), questi dividono la stringa in campi in modo che la stringa stessa è visualizzata su più righe.

Se x% è 0 a$ è ignorato e rimangono o l'ultima stringa o l'ultimo record visualizzati. Se viene premuto un tasto che non sia un tasto freccia, viene restituito il valore corrispondente ad esso.

Tra un comando DISP con x% uguale ad 1 o a -1 e un comando DISP con x% uguale a zero, non dovrebbe esservi nessun altro comando funzione. Per esempio:

A%=DISP(1,A$) WHILE A%<>13 A$=DISP(0,"") ENDWH

Questo visualizza A$ finchè non è premuto EXE; chiaramente non vi è nessuna ragione per inserire tra questi due DISP un comando o una funzione che operino sullo schermo. Far questo potrebbe dar luogo a risultati non previsti (13 è il codice corrispondente ai tasto EXE).

Per maggiori dettagli vedere l'appendice A). Vedere anche VIEW e EDIT.

DO/UNTIL

Sintassi: DO
   <Statement list>
UNTIL x=y
Il comando DO è usato per indicare l'inizio di una lista di una o più istruzioni che termina col comando UNTIL. Le istruzioni della lista vengono ripetute finché l'espressione che segue UNTIL non risulti logicamente vera.

DOW
Sintassi: d%=DOW(day%,month%,year%)
Restituisce il giorno della settimana, come numero tra 1 e 7 (Lunedi = 1), corrispondente alle data che avete specificato. Per esempio: D%=DOW(25,12,1990) restituisce 2, cioè martedì.

EDIT
Sintassi: EDIT var$
Visualizza sullo schermo una stringa che si può, poi, correggere usando i tasti cursore e il tasto DEL. var$ può essere il nome di una variabile stringa o il nome di un campo.

Quando le correzione è terminata, per restituire la stringa modificata, premere EXE. Se si preme EXE prima di aver apportato qualsiasi modifica, la stringa verrà restituita inalterata. Se durante la correzione si preme ON/CLEAR, la stringa verrà cancellata e al suo posto potrà essere scritto un nuovo testo. Se, però, si usa con questo comando anche il comando TRAP e se ON/CLEAR viene premuto due volte, la stringa verrà cancellata e il controllo passerà alla prossima riga della procedura mentre verrà attivata la condizione di errore ESCAPE.
Vedere anche DISP e VIEW.

ELSE
Vedi IF.

ENDIF
Vedi IF.

ENDWH
Vedi WHILE.

EOF
Sintassi: e%=EOF
Verifica l'End of File. Qualsiasi istruzione di programma che cerchi di leggere oltre l'ultimo record di un file dati darà luogo alla segnalazione che la fine del file (EOF) è stata raggiunta. Questa può essere verificata nel modo seguente:
DO <statement list> UNTIL EOF
La funzione EOF restituisce il valore -1 (vero) se la condizione di fine file è stata raggiunta, oppure 0 (falso).

ERASE
Sintassi: ERASE
Cancella il record corrente del file corrente. In conseguenza di questo comando diventa record corrente il primo record dopo quello cancellato. Se il record cancellato era l'ultimo del file, allora per effetto del comando il record corrente sarà un record nullo e verrà restituito un EOF.

ERR
Sintassi: e%=ERR
Restituisce il numero dell'ultimo errore che si è verificato. L'appendice D dà l'elenco di tutti i messaggi di errore ordinati per numero. Il numero restituito è compreso tra 0 e 255. Se non si è verificato nessun errore, viene restituito 0.
Vedere anche ERR$, RAISE, ONERR.

ERR$
Sintassi: e$=ERR$(x%)
Restituisce un messaggio di errore come stringa. x% può essere sia un numero - ad esempio E$=ERR$(240) per restituire il messaggio di errore 240, o ERR - ad esempio PRINT ERR$(ERR), per stampare il messaggio dell'ultimo errore che si à verificato. Se il numero è fuori dall'intervallo 192,255, è restituito il messaggio "ERR SCONOSCIUTO". L'Appendice D fornisce l'elenco dei messaggi di errore.
Vedere anche ERR, ONERR, RAISE.

ESCAPE OFF/ESCAPE ON
Sintassi: ESCAPE OFF o ESCAPE ON
Attiva e disattiva il tasto ON/CLEAR. Normalmente è possibile, per bloccare un programma in esecuzione, premere ON/CLEAR e, quindi, premere A per abbandonano. ESCAPE OFF inibisce l'uso di ON/CLEAR per fare una pausa; ESCAPE ON, invece, riattiva questa funzione di ON/CLEAR. Quest'ultimo è lo stato normale.

Attenzione: se il vostro programma entra in un ciclo che non ha un'uscita logica e se è stato attivato ESCAPE OFF, vi sarà impossibile abbandonare il programma a meno che non togliate la batteria dall'Organiser. In questo caso, però, tutti i dati nella RAM della macchina andranno persi.

EXIST
Sintassi: e%=EXIST("dev:fname")
Verifica l'esistenza sul dispositivo dev: di un file dati di nome fname. Se il file esiste viene restituito un vero logico e, in caso contrario, un falso logico. In questo modo EXIST può essere utilizzato in un'istruzione IF; per esempio:
IF EXIST ("a:clients") <statement list> ENDIF
Vedi anche DIR$.

EXP
Sintassi: e=EXP(x)
Restituisce i valore di e (2.71828...) elevato a x.

FIND
Sintassi: f%=FIND(a$)
Cerca nel file dati corrente la stringa posta tra parentesi. Se la trova restituisce il numero del record dove la stringa è stata localizzata e fa diventare quest'ultimo record corrente. Se le stringe non è stata trovata, viene restituito zero.
Vedi anche NEXT.

FINDW
Sintassi: F%=FINDW(a$)
Cerca nel file dati corrente la stringa posta tra parentesi analogamente a FIND; la differenza sia nel fatto che è possibile inserire nella stringa del caratteri jolly. Per esempio, per trovare un record contenente contemporaneamente "Dr" e o "BROWN" o "BRAUN" l'istruzione sarà:
F%=FINDW("*DR*BR++N")

FIRST
Sintassi: FIRST
Fa diventare il primo record di un file dati il record corrente.
Vedere anche ERASE, NEXT, POSITION, LAST, BACK, POS.

FIX$
Sintassi: f$=FIX$(x,y%,z%)
Restituisce il valore di x sotto forma di stringa con y% cifre decimali in un campo di z% caratteri. Se z% è negativo, allora la stringa è allineata a destra.
FIX$(123456.127,2,9) = "123456.13"
FIX$(1,2,-5) = " 1.00"
Se il numero non potesse essere contenuto nel campo specificato, allora verrà restituita una stringa di asterischi.
Vedere anche GEN$, NUM$, SCI$.

FLT
Sintassi: f=FLT(x%)
Converte l'espressione intera tra parentesi in un numero a virgola mobile.

FREE
Sintassi: f%=FREE
Restituisce il numero di byte disponibili nell'area di lavoro.
Vedere anche SPACE.

GEN$
Sintassi: g$=GEN$(x,y%)
Restituisce il valore di x sotto forma di stringe di y% caratteri. GEN$ cerca di rappresentare il numero, nell'ordine, come intero, come numero decimale o in rappresentazione scientifica. Se y% è negativo, allora il risultato sarà giustificato a destra. Se il numero non può essere contenuto nei campo specificato, allora viene restituita una stringa di asterischi.
Vedere anche FIX$, NUM$, SCI$.

GET
Sintassi: g%=GET
Attende che venga premuto un tasto di cui restituisce il valore ASCII o il codice speciale. Per esempio, se è battuta la minuscola di A, viene restituito il numero intero 97. Se è premuto, invece, il tasto EXE, viene restituito il valore 13. Andare all'Appendice A per le tabelle del codici ASCII e dei codici speciali.
Vedere anche GET$, KEY, KEY$, PAUSE.

GET$
Sintassi: g$=GET$
Attende che venga premuto un tasto e ne restituisce il valore sotto forma di stringa. Per esempio, se viene battuta la minuscola di A, la stringa restituita sarà "a".
Vedere anche GET, KEY, KEY$.

GLOBAL
Sintassi: GLOBAL var1,var2%,var3$(LENGTH),var4(n)
È usato per dichiarare le variabili che dovranno essere disponibili nella procedura corrente e in tutte le procedure seguenti nei programma.

I nomi di variabili che non terminano con un carattere speciale si riferiscono a variabili in virgola mobile; quelli che terminano col segno di percento (%) indicano variabili intere, mentre quelle che terminano coi segno di dollaro ($) indicano variabili stringa. I nomi delle variabili stringa debbono essere seguiti dalla lunghezza massima, posta tra parentesi.

L'ultima variabile dell'esempio riportato più sopra à una schiera in virgola mobile. Il numero tra parentesi rappresenta il numero di elementi della schiera. Le variabili a schiera possono essere di tutti e tre i tipi.

I nomi delle variabili possono essere lunghi fino ad B caratteri alfanumerici, ma il primo di questi deve essere una lettera. La lunghezza deve tener conto dell'eventuale % o $. Vi possono essere più istruzioni GLOBAL e LOCAL, ma esse debbono costituire sempre le prime istruzioni di una procedura.

Per maggiori dettagli vedere il capitolo relativo alle variabili.
Vedi anche LOCAL.

GOTO
Sintassi: GOTO label::
Trasferisce il controllo dei programma alla linea con l'etichetta label::. Questa etichetta deve essere contenuta nella procedura corrente e deve terminare con ::. Le etichette possono essere lunghe fino ad 8 caratteri, :: esclusi.

HEX$
Sintassi: h$=HEX$(x%)
Restituisce la forma esadecimale (in base 16) dell'espressione intera contenuta tra parentesi. Ad esempio, HEX$(255) restituirà "FF". (È possibile introdurre numeri esadecimali facendoli precedere da $. Così: PRINT $FF stamperà 255).

HOUR
Sintassi: h%=HOUR
Restituisce l'ora corrente utilizzando l'orologio di sistema (0-23).
Vedere anche SECOND, MINUTE, DAY, MONTH, YEAR, DATIM$.

IABS
Sintassi: i%=IABS(x%) Restituisce il valore assoluto di un numero intero. Ad esempio IABS(-10) dà 10.
Vedere anche ABS.

IF/ELSEIF/ELSE/ENDIF

Sintassi: IF x=y <statement list> ELSEIF x=z <statement list> ELSE <statement list> ENDIF
Le istruzioni IF sono seguite immediatamente da un'espressione. Se il risultato dell'espressione è logicamente vero, (non zero), allora vengono eseguite le istruzioni che seguono; se invece, il valore dell'espressione è logicamente falso, (zero), allora queste istruzioni sono ignorate. L'elenco delle istruzioni deve terminare con un ENDIF.

L'istruzione ELSEIF è facoltativa, ma, se è inclusa e l'espressione che segue è logicamente vera, mentre nessuna di quelle che precedono lo è, allora viene eseguito il prossimo gruppo di istruzioni. Vi possono essere più ELSEIF, ciascuna seguita dal proprio gruppo di istruzioni.

L'istruzione ELSE è facoltativa. Se nessuna delle espressioni che le precedono è logicamente vera, allora viene eseguito il gruppo di istruzioni comprese tra ELSE ed ENDIF.

INPUT

Sintassi: INPUT var% INPUT var INPUT var$ INPUT log.field
Permette, durame l'esecuzione di un programma, di inserire dati dalla tastiera. Sono possibili quattro varianti.

Le variabili richiamate debbono essere state dichiarate precedentemente con un comando GLOBAL od un comando LOCAL, oppure debbono essere nomi di campi del file corrente. Se si introduce una stringa, questa non deve superare la lunghezza massima dichiarata.

Se si dà un dato errato, ad esempio, una stringa invece di un intero, allora viene visualizzato il simbolo ? come invito a riprovare. Tuttavia, se unitamente all'istruzione di INPUT è usato anche il comando TRAP, il controllo del programma passa all'istruzione che segue mentre viene attivata la condizione di errore ESCAPE.

INT
Sintassi: i% = INT(x)
Restituisce la parte intera di x. I numeri negativi sono arrotondati per diletto; così INT(-5.3) restituisce -6 . Può essere utilizzata solo se il valore restituito è compreso nei limiti dell'Organiser.
Vedere anche INTF.

INTF
Sintassi: i=INTF(x)
Opera analogamente alla funzione INT, ma restituisce un numero a virgola mobile. Si può dovere far ricorso ad essa quando nel calcolo un intero supera i limiti per gli interi dell'Organiser. Per esempio: PRINT INTF(320000/3)*100 .

KEY
Sintassi: k%=KEY
Restituisce il valore ASCII corrispondente al tasto premuto; se non si è premuto nessun tasto, allora restituisce il valore 0. Il comando non si mette in attesa che venga premuto un tasto.
Vedi anche PAUSE, GET, GET$, KEY$.

KEY$
Sintassi: k$=KEY$
Restituisce una stringa col carattere del tasto premuto; se non è stato premuto nessun vasto, allora restituisce una stringa nulla. KEY$ non attende che venga premuto un tasto.
Vedi anche KEY, GET, GET$.

KSTAT
Sintassi: KSTAT x%
Imposta la tastiera in modo SHIFT, CAP, ecc. x% è un intero compreso tra 1 e 4:
1   Alfabetico - maiuscolo
2   Alfabetico - minuscolo
3   Numerico - maiuscolo
4   Numerico - minuscolo

LEFT$
Sintassi: b$=LEFT$(a$,x%)
Restituisce i primi x% caratteri di sinistra della stringa a$.
Vedere anche RIGHT$, MID$, LEN, LOC.

LEN
Sintassi: a%=LEN(a$)
Restituisce la lunghezza della stringa a$.

LN
Sintassi: a=LN(x)
Restituisce il logaritmo naturale dell'espressione tra parentesi.
Vedere anche LOG.

LOC
Sintassi: a%=LOC(a$,b$)
Restituisce la posizione della stringa b$ nella stringa a$. Per esempio: LOC("STANDING","AND") restituirebbe 3 poichè le stringe "AND" inizia alla terza posizione della stringe principale. Se b$ non è contenuta in a$, allora viene restituito il valore 0.
Vedere anche LEFT$, RIGHT$, MID$, LEN.

LOCAL
Sintassi: LOCAL var1%,var2,var3$(length),var4(n)
Viene utilizzata per dichiare variabili utilizzabili solo nella procedura corrente. Le altre procedure possono usare lo stesso nome per altre variabili.
Per maggiori dettagli sulla dichiarazione delle variabili, vedere GLOBAL.

LOG
Sintassi: a=LOG(x)
Restituisce il logaritmo in base 10 dell'espressione posta tra parentesi.
Vedere anche LN.

LOWER$
Sintassi: b$=LOWER$(a$)
Restituisce la stringa passata tra parentesi con tutte le maiuscole convertite in minuscole.
Vedere anche UPPER$.

LPRINT
Sintassi: LPRINT x,y;a$
Stampa su una stampante: se non è collegata nessuna stampante viene segnalato DISP INESISTENTE. Nel caso si riceva il messaggio quando la Psion Printer II è effettivamente collegata, provare a premere ON/CLEAR dal manu principale per caricare il software di stampa.

Se le voci da stampare sono separate fra loro da virgole, esse vengono stampate separate da uno spazio; se al posto delle virgole si sono usati dei punti-e-virgola, gli spazi vengono soppressi.

Un punto-e-virgola finale fa sì che il prossimo comando di stampa stampi immediatamente di seguito sulla stessa riga; una virgola finale ha lo stesso effetto, ma inserisce uno spazio. Negli altri casi la stampa avviene su una nuova riga.

Per esempio, l'istruzione:
LPRINT "QUEST'ANNO E' IL",YEAR
produce la seguente stampa:
QUEST'ANNO E' IL 1989

Il comando PRINT opera come il comando LPRINT; la differenza sta nel fatto che l'uscita è sullo schermo invece che sulla stampante.

MAX

Sintassi: m=MAX(Item1,item2,item3)
m=MAX(array(),n)
Restituisce il maggiore di una lista di valori. La lista può essere un elenco di voci separate da virgola, oppure può essere formato dagli elementi di una schiera a virgola mobile.
Per maggiori informazioni, vedere MEAN.

MEAN

Sintassi: m=MEAN(item1,item2,item3)
m=MEAN(array(),n)
Restituisce la media di una lista di numeri. La lista può essere un elenco di numeri separati da virgola, oppure può essere formato dagli elementi di una schiera a virgola mobile.

1 Gli elementi della lista possono essere, contemporaneamente, numeri reali, numeri interi e numeri a virgola mobile. Per esempio:
m=MEAN(12,x,y%,3.6)

2 Quando opera su una schiera, i due argomenti entro parentesi sono il nome della schiera ed il numero di elementi su cui si vuole operare. Per esempio: per avere la media dei primi tre elementi della schiera arr: m=MEAN(arr(),3). Nell'esempio che segue il risultato è 12.5:

LOCAL a(3) a(1)=10 a(2)=15 a(3)=20 PRINT MEAN(a(),2)

MENU
Sintassi: m%=MENU(menuitem1,menuitem2...)
Presenta un menu di opzioni e permette di fare la scelta al solito modo. Viene restituito il numero dell'opzione scelta. Se si preme ON/CLEAR, viene restituito il valore 0.
Le opzioni del menu sono presentate a partire dalla riga superiore dello schermo.

MENUN
Sintassi: m%=MENUN(n%,menuitem1,menuitem2...)
Presenta un menu di opzioni analogamente al comando MENU; tuttavia le opzioni sono presentate in maniera diversa a seconda del valore di n%:
n%=0 Esattamente come con MENU
n%=1 Presenta un menu mono-riga
n%=2 Presenta un menu multi-riga, partendo dalla riga su cui è posizionato, in quel momento, il cursore. Qualsiasi testo visualizzato sulle righe sopra il cursore rimane sullo schermo.

MID$
Sintassi: m$=MIDS(a$,x%,y%)
Restituisce la stringa di y% caratteri formata del caratteri di a$ a partire dal carattere in posizione x%.
Vedere anche LEFT$, RIGHT$, LEN, LOC.

MIN

Sintassi: m=MIN(item1,item2,item3)
m=MIN(array(),n)
Restituisce il più piccolo tra gli elementi di una lista. La lista può essere costituita da voci separate da virgola, o dagli elementi di una schiera a virgola mobile. Per ulteriori dettagli, vedere anche MEAN.

MINUTE
Sintassi: m%=MINUTE
Restituisce i minuti prelevandoli dell'orologio di sistema (da 0 a 59).
Vedi anche SECOND, HOUR, DAY, MONTH, YEAR, DATIM$.

MONTH
Sintassi: m%=MONTH
Restituisce il mese corrente prelevandolo dall'orologio di sistema (da 1 a 12).
Vedi anche SECOND, MINUTE, HOUR, DAY, YEAR, DATIM$.

MONTH$
Sintassi: m$=MONTH$(x%)
Converte il numero x% (da 1 a 12) nel mese corrispondente.
Ad esempio: M$=MONTHS(1) restituisce GEN.

NEXT
Sintassi: NEXT
Fa si che il prossimo record del file corrente diventi il record corrente; se il comando viene fatto operare oltre la fine del file, non viene segnalato nessun errore, ma il file corrente è un record nullo e la condizione di EOF viene attivata.
Vedi anche FIRST, LAST, BACK, POSITION, POS.

NUM$
Sintassi: n$= NUM$(x,y%)
Restituisce come stringa di y% caratteri la parte intera del numero a virgole mobile x. Se y% è negativo, allora è giustificata a destra; se, poi, il numero non può essere contenuto nel campo specificato, viene restituita una stringa di asterischi.
Vedi anche FIX$, GEN$, SCI$.

OFF
Sintassi: OFF o OFF x%
Spegne l'Organiser; se poi viene premuto ON/CLEAR, il programma riprende all'istruzione immediatamente dopo il comando OFF. x% è un numero compreso tra 1 e 1800; se esso è incluso nel comando, la macchina rimane spenta x% secondi.

OPEN
Sintassi: OPEN "dev:fname",log,fld1,fld2
Apre, col nome di file logico log e con i campi specificati da fld1, fld2, ecc., un file presente sul dispositivo dev:. Dal programma si può accedere ad esso col nome di file logico (A, B, C o D). Possono essere aperti contemporaneamente sino a 4 file. Per maggiori dettagli, vedere il paragrafo relativo all'apertura di un file nel capitolo dedicato alla gestione dei file dati.
Vedi anche CREATE, CLOSE, DELETE, USE.

ONERR
Sintassi: ONERR label:: e ONERR OFF
Se, durante l'esecuzione di un programma si verifica un errore, l'istruzione ONERR label:: trasferisce il controllo alla riga che contiene l'etichetta. ONERR OFF annulla l'istruzione ONERR label:: cosicchè gli errori che si verificano dopo l'istruzione ONERR OFF non sono più intrappolati. Si raccomanda vivamente di inserire il comando ONERR OFF subito dopo l'etichetta e di testare espressamente la condizione PILA SCARICA.

PAUSE
Sintassi: PAUSE x%
Provoca una pausa nell'esecuzione di un programma con modalità che dipendono dal valore di x%:

0Attende che venga premuto un tasto.
<0Attende che venga premuto un tasto o un massimo di x% (in valore assoluto) ventesimi di secondo.
>0Attende per x% ventesimi di secondo.

Cosi, per esempio, PAUSE 100 origina una pausa di 5 secondi. Nel primi due casi, il tasto premuto viene memorizzato in un buffer, pertanto al consiglia di ripulire quest'ultimo utilizzando la funzione KEY:

<statement list> PAUSE 0 KEY <statement list>

Il tasto memorizzato nel buffer dell'istruzione PAUSE 0 viene preso in input dall'istruzione KEY.

PEEKB
Sintassi: p%=PEEKB(x%)
Restituisce il valore (da 0 a 255) memorizzato nella locazione di memoria specificata dall'espressione entro parentesi.

PEEKW
Sintassi: p%=PEEKW(x%)
Restituisce il valore dell'intero a due byte memorizzato nelle locazioni di memoria x% e x%+1.

PI
Sintassi: p = PI
Restituisce il valore di Pigreco (3.14...)

POKEB
Sintassi: POKEB x%,y%
Scrive il numero y% che deve essere compreso tra 0 e 255 nella locazione di memoria individuata dal numero intero x%. Indirizzi superiori a 32767 sono identificati o con numeri negativi o con numeri esadecimali. Ad esempio: $FFFF=-1 individua l'indirizzo 65535.
Attenzione: un uso distratto di questo comando può parure alla perdita di tutti i dati registrati nell'Organiser.

POKEW
Sintassi: POKEW x%,y%
Scrive l'intero y% in due locazioni di memoria successive di cui la prima ha indirizzo x% e con il byte più significativo nell'indirizzo inferiore.
Attenzione: un uso distratto di questo comando può portare alla perdita di tutti i dati registrati nell'Organiser.

POS
Sintassi: p%=POS
Restituisce il numero dei record corrente dei file corrente.

POSITION
Sintassi: POSITION x%
Fa diventare record corrente il record numero x% del file corrente. Se x% supera il numero del record del file, allora viene attivata la condizione di EOF.
Vedi anche FIRST, NEXT, LAST, BACK, POS.

PRINT
Sintassi: PRINT x,y%;a$
Visualizza sullo schermo un numero od un testo.

Se le voci da visualizzare sono separate da virgole, esse vengono visualizzate separate da uno spazio; se al posto delle virgole si sono usati del punto-virgola, gli spazi vengono soppressi. Un punto-e-virgola finale fa sì che il prossimo comando di stampa visualizzi immediatamente di seguito sulla stessa riga; una virgola finale ha lo stesso effetto, ma inserisce uno spazio. Negli altri casi la visualizzazione avviene su una nuova riga. Per esempio, l'istruzione:
PRINT "QUEST'ANNO E' IL",YEAR
visualizza sullo schermo
QUEST'ANNO E' IL 1989

Il comando LPRINT opera come il comando PRINT; la differenza sta nel fatto che l'uscita è sulla stampante invece che sullo schermo.

RAD
Sintassi: n=RAD(x)
Converte x gradi in radianti.
Vedere anche DEG.

RAISE
Sintassi: RAISE x%
Genera artificialmente un errore anche se questo non si è effettivamente verificato e, se prima non si è usato il comando ONERR, verrà emesso il corrispondente messaggio. I numeri di codifica dei possibili errori sono compresi tra 192 e 255; la lista completa dei messaggi d'errore è riportata nell'Appendice D. Per ulteriori informazioni, vedere il capitolo relativo alla gestione degli errori.
Vedi anche ONERR, ERR, ERR$.

RANDOMIZE
Sintassi: RANDOMIZE x
Assegna un nuovo seme al generatore di numeri casuali in modo che possa iniziare una nuova sequenza. RANDOMIZE va usata ogni volta che si vuole ripetere la medesima sequenza di numeri casuali.
Vedi anche RND.

RECSIZE
Sintassi: r%=RECSIZE
Restituisce le lunghezza, in byte, del record corrente. Nessun record può superare la lunghezza di 254 byte; la funzione può essere, pertanto, utilizzata per verificare che l'aggiunta di dati ad un record non gli faccia superare questo limite.

REM
Sintassi: REM text
L'istruzione REM precede i commenti esplicativi che possono essere inseriti in un programma. L'Organiser ignora tutto quello che segue REM, fino alla fine della riga.

RENAME
Sintassi: RENAME "dev:fname1","fname2'
Assegna al file fname1, sul dispositivo dev:, il nuovo nome fname2.
Per esempio RENAME "B:ADDR","OLDADDR"

REPT$
Sintassi: r$=REPT$(a$,x%)
Restituisce una stringa costituita da x% ripetizioni di a$.
Vedi anche LEFT$, RIGHT$, MID$, UPPER$, LOWER$, LEN, LOC.

RETURN
Sintassi: RETURN o RETURN x
Usata da sola, l'istruzione RETURN termina l'esecuzione di una procedura e restituisce il controllo al punto da dove era stata chiamata. Il suo uso alla fine di una procedura è facoltativo. RETURN può anche essere usate per passare un valore al livello e cui era stata chiamata; il valore deve essere fornito subito dopo l'istruzione RETURN: ad esempio, RETURN X%, oppure RETURN X o, ancora, RETURN X$.

Una procedura può restituire solo valori dello stesso tipo di quello indicato dell'ultimo carattere della procedura; così, proc$: può restituire solo una stringa.

RIGHT$
Sintassi: r%=RIGHT$(a$,x%)
Restituisce al ultimi x% caratteri di destra della stringe a$.
Vedi anche LEFT$, MID$, REPT$, LEN, LOC.

RND
Sintassi: r=RND
Restituisce un numero casuale a virgola mobile compreso tra 0 (incluso) e 1 (escluso).
Vedi anche RANDOMIZE.

SCI$
Sintassi: a$=SCI$(x,y%,z%)
Restituisce, sotto forma di stringa, la notazione scientifica di x, con z% cifre di cui y% decimali. Per esempio
SCI$(123456,2,8) ="1.23E+05" SCI$(1,2,8) ="1.00E+00" SCI$(123456789,2,-9) =" 1.23E+08"
Se il numero non può essere contenuto nel campo previsto, allora viene restituita una stringa di asterischi.
Vedi anche FIX$, GEN$, NUM$.

SECOND
Sintassi: s%=SECOND
Restituisce i secondi, da 0 a 59, prelevandoli dall'orologio di sistema.
Vedere anche MINUTE, HOUR, DAY, MONTH, YEAR.

SIN
Sintassi: s=SIN(x)
Restituisce il seno dell'angolo in radianti dato dall'espressione entro parentesi.

SPACE
Sintassi: s=SPACE
Restituisce il numero di byte di memoria liberi presenti nel dispositivo corrente. È necessario aver prima aperto un file sul dispositivo.
Vedere anche FREE.

SQR
Sintassi: s=SQR(x)
Restituisce la radica quadrata dell'espressione tra parentesi.

STD

Sintassi: s=STD(item1,item2,item3)
s=STD(array(),n)
Restituisce la deviazione standard dei valori della lista. La lista può essere costituita da valori separati da virgole o dagli elementi di una schiera a virgola mobile.
Per maggiori dettagli, vedere anche MEAN.

STOP
Sintassi: STOP
Interrompe l'esecuzione di un programma e riporta l'Organiser al punto dove il programma era stato lanciato: ad esempio, il menu principale o la calcolatrice.

SUM

Sintassi: s=SUM(item1,item2,item3)
s=SUM(array(),n)
Restituisce la somma degli elementi della lista: questi possono essere valori separati da virgola od elementi di una schiera virgola mobile.
Per maggiori dettagli, vedere anche MEAN.

TAN
Sintassi: t=TAN(x)
Restituisce la tangente dell'angolo in radianti dato dall'espressione entro parentesi.

TRAP
Sintassi: TRAP command
TRAP può precedere uno qualunque di questi comandi:
APPEND​/​BACK​/​CLOSE​/​COPY​/​COPYW​/​CREATE​/​DELETE​/​DELETEW​/​ERASE​/​EDlT​/​FIRST​/​INPUT​/​LAST​/​NEXT​/​OPEN​/​POSITION​/​RENAME​/​UPDATE​/​USE
Per esempio TRAP FIRST.
Ogni errore che si verifica durante l'esecuzione del comando viene intrappolato e l'istruzione successiva viene eseguita indipendentemente dal fatto che tale errore provochi o no, in condizioni normali, l'emissione di un messaggio d'errore.

UDG
Sintassi: UDG x%,a%,b%,c%,d%,e%,f%,g%,h%
Definisce un carattere da visualizzare: x% è il numero di identificazione del carattere (0-7) mentre gli interi da a% ad h% definiscono le singole vigne dal carattere.
Per esempio, l'istruzione:
UDG 7,0,0,0,0,0,0,0,31
definiscono come carattere UDG7 la sottolineatura.
Per una spiegazione più dettagliata del comando, vedere l'Appendioe A.

UNTIL
Vedere DO.

UPDATE
Sintassi: UPDATE
Il record corrente del file corrente viene eliminato ed i dati attuali vengono aggiunti come un nuovo record aggiunto in coda al file.
Vedere anche APPEND.

UPPER$
Sintassi: u$=UPPER$(a$)
Restituisce la stringa a$ con tutti i caratteri minuscoli convertiti in caratteri maiuscoli.
Vedere anche LOWER$.

USE
Sintassi: USE log
Selezione per l'uso il file col nome di file logico log (A, B, C o D) che deve essere stato precedentemente aperto con un comando CREATE od un comando OPEN.
Vedere anche OPEN, CLOSE, CREATE, DELETE.

USR
Sintassi: u%=USR(x%,y%)
I numeri x% e y% sono passati, rispettivamente, al registro PC ed al registro D del microprocessore HD6303X. Il microprocessore, a sua volta, manda in esecuzione il programma in linguaggio macchina che inizia alla locazione x%. Quando la routine è terminata, il contenuto del registro X è restituito come numero intero.
Attenzione: un uso distratto di questo comando può portare alla perdita di tutti i dati registrati nell'Organiser.
Vedere anche USR$, ADDR.

USR$
Sintassi: u$=USR$(x%,y%)
I numeri x% e y% sono passati, rispettivamente, al registro PC ed al registro D del microprocessore HD6303X. Il microprocessore, a sua volte, manda in esecuzione il programma in linguaggio macchina che inizia alla locazione x%. Une volta eseguita la routine il contenuto dei registro D dà l'indirizzo di una stringa di un byte che viene, così, restituita.
Attenzione: un uso distratto di questo comando può portare alla perdita di tutti i dati registrati nell'Organiser.
Vedere anche USR, ADDR.

VAL
Sintassi: v=VAL(a$)
Restituisce un numero a virgola mobile che rappresenta il valore della stringa numerica entro parentesi. Per esempio, VAL("470.0") restituisce il valore 470.0. La stringa non può contenere caratteri non numerici, mentre è consentita la notazione scientifica di modo che VAL("1.3El0") restituirebbe il valore 1.3E10.

VAR

Sintassi: v=VAR(item1,item2,item3)
v=VAR(array(),n)
Restituisce la varianza di una lista di valori, questi possono essere dati separati da virgola oppure elementi di una schiera a virgola mobile.
Per maggiori informazioni, vedere anch MEAN.

VIEW
Sintassi: v%=VIEW(x%,a$)
Visualizza a$ sulla riga x% (x% = 1, 2, 3 e 4) dello schermo. a$ può essere una stringa, una variabile a stringa od un nome di campo.
Se il testo è più lungo di 20 caratteri, la stringa scorre automaticamente verso sinistra; utilizzando i tasti cursore è possibile invertire il senso di scorrimento.
Se viene premuto un qualsiasi altro tasto, lo scorrimento cessa, e viene visualizzato il codice ASCII del tasto premuto. Se, poi, viene dato di nuovo un comando VIEW con a$ nulla, lo scorrimento riprende a partire dal punto dove era stato bloccato.
Vedere anche DISP.

WEEK
Sintassi: w%=WEEK(day%,month%,year%)
Restituisce il numero corrispondente alla settimana cui appartiene una data specificata. La settimana inizia con Lunedi per cui, il primo Lunedì di Gennaio è l'inizio della prima settimana dell'anno.

WHILE/ENDWH

Sintassi: WHILE x<>y <statement list> ENDWH
La struttura inizia con un comando WHILE seguita da un'espressione numerica.
Le istruzioni che seguono, che devono terminare con un comando ENDWH, vengono eseguite fintanto che l'espressione risulta logicamente vera (non zero).
Vedere anche DO/UNTIL.

YEAR
Sintassi: y%=YEAR
Restituisce l'anno corrente (dal 1900 al 2155 ) prelevandolo dell'orologio di sistema.
Vedere anche SECOND, MINUTE, HOUR, DAY, MONTH.


APPENDICE A
IL SET DI CARATTERI DELL'ORGANISER

La tabella delle pagina seguente riporta il set di tutti i caratteri dell'Organiser. I caratteri di uso più frequente sono accessibili direttamente dalla tastiera; vi sono però altri caratteri che non possono essere digitati direttamente. Questi sono accessibili mediante la funzione CHR$ dell'OPL.

STAMPARE CARATTERI CHE NON APPAION SULLA TASTIERA

Per mezzo della funzione CHR$ coi numero appropriato preso dalla tabella della pagina seguente, potete stampare sullo schermo o sulla stampante, o potete assegnare qualunque dei caratteri mostrati a variabili a stringa. Per esempio, per visualizzare il punto di domanda, l'istruzione è:

PRINT CHR$(63)

Per visualizzare a pound sign, l'istruzione e:

PRINT CHR$(156)

TROVARE IL CODICE ASCII DI UN CARATTERE SULLA TASTIERA

Potete trovare il valore ASCII di qualsiasi carattere sulla tastiera in qualunque momento senza guardare la tabella. Potete fare ciò battendo il segno % seguito dal carattere. Per esempio, se battete nella calcolatrice %P, vi viene restituito il numero 90.

Character Set, part 1

Queste tabelle mostrano i caratteri che hanno i codici ASCII da 32 a 255. 32 è il carattere dello spazio.

I codici da 0 a 7 sono i caratteri definiti dall'utente (pagina...)
I codici da 8 a 31 sono caratteri di controllo (pagina A-4)

Character Set, part 2

ACCEDERE AI VALORI ASCII NELLE PROCEDURE

È spesso utile accedere ai valore ASCII di un carattere in una procedura - per esempio se volete sapere se un utente ha battuto S o N.

Per fare ciò dovete usare il segno % e il carattere: per esempio %y. L'esempio sottostante è parte di una procedura in cui vi è chiesto se volete cancellare qualcosa. Se battete N il programma si ferma. Se battete S viene chiamata un'altra procedura dal nome erase:. Se battete un tasto diverso da S o N la procedura va ad una etichetta allo scopo di darvi un'altra possibilità.

PRINT "ERASE S/N" label:: g%=GET IF g%=%N OR g%=%n :STOP ELSEIF g%=%Y OR g%=%y :ERASE: ELSE GOTO label:: ENDIF

CODICI PER TASTI SPECIALI

Quando si usano funzioni come GET e KEY, viene normalmente restituito il codice ASCII per il carattere sul tasto. I tasti non in ASCII restituiscono questi numeri:

ON/CLEAR1
MODE2
3
4
5
6
SHIFT e DEL7
DEL8
EXE13

I CARATTERI DI CONTROLLO

I numeri da 8 a 26 hanno un uso speciale per lo schermo. Essi non producono un carattere visibile, ma possono essere usati assieme al comando PRINT per produrre gli effetti sottoelencati. Per esempio, l'istruzione PRINT CHR$ ripulisce la terza riga dello schermo.

CHR$(8) Muove il cursore di una posizione verso sinistra.
CHR$(9) Muove il cursore alla successiva posizione tab. (Posizioni 0 e 10 sullo schermo).
CHR$(10) Sposta il cursore sulla linea seguente.
CHR$(11) Sposta il cursore sulle linea superiore dello schermo.
CHR$(12) Ripulisce lo schermo (analogo a CLS).
CHR$(13) Muove il cursore a sinistra della riga corrente.
CHR$(14) Sposta il cursore in alto a sinistra dopo aver ripulito la prima riga dello schermo.
CHR$(15) Sposta il cursore in basso a sinistra dopo aver ripulito la seconda riga dello schermo.
CHR$(16) Fa suonare il cicalino dell'Organiser.
CHR$(17) Ricarica la prima e la seconda riga
CHR$(18) Ricarica la prima riga
CHR$(19) Ricarica la seconda riga
CHR$(20) Ricarica la terza riga
CHR$(21) Ricarica la quarta riga
CHR$(22) Ripulisce la terze riga
CHR$(23) Ripulisce la quarta riga
CHR$(24) Stampa trattini, come quelli al di sopra di un menu multi-riga, sulla seconda riga. (Usa UDG 2)
CHR$(25) Stampa puntini, come quelli al di sopra di un menu a una riga, sulla terza riga. (Usa UDG 2)
CHRS(26) Ripulisce la fine della riga.
Da CHR$(27) a CHR$(31) sono riservati.

CARATTERI DEFINITI DALL'UTENTE

Per lo schermo i numeri da 0 a 7 sono riservati per i caratteri definiti dall'utente. Per definire lo schema di punti che appaiono quando stampate uno di questi caratteri con la funzione CHR$, dovete usare il comando UDG.

Ogni carattere deve essere definito riga per riga da una serie di 8 bytes, cominciando con la prima riga del carattere. (Da ognuno degli otto bytes che costituiscono i caratteri, vengono usati solo gli ultimi cinque bits da 16 a 1 perchè i caratteri sono solo cinque punti incrociati).

UDG

Per definire l'uomo che sta correndo come carattere numero 1, userete l'istruzione che segue. Il primo numero è il numero del carattere e gli 8 numeri successivi rappresentano ogni riga del carattere.

UDG 1,30,14,4,14,30,14,11,25

voi potete usare questa istruzione per visualizzare l'uomo:

PRINT CHR$(1)

0 2 345671 | | ||||||
X 12:45a Edita Nuovo Esegue Stampa Lista Copia  Cancel  

L'orologio dello schermo, i simboli nell'angolo in alto a sinistra e le linee punteggiate sotto e sopra i menu, usano tutti degli UDG. Quindi, ogni volta che sono visualizzati, essi si sostituiscono ad altri UDG che sono stati definiti. Dovete quindi ridefinire i vostri UDG ogni volta che volete visualizzarli.

Ecco i numeri UDG usati dall'orologio, dal simbolo e dalle sottolineature.

Se volete visualizzare un menu sottolineato con un simbolo e l'orologio dovete usare l'UDG 0 e 2 per il simbolo e la sottolineatura. Il programma telephone logging del Capitolo 8 è un esempio di questo.


APPENDICE B
Dati tecnici

Dimensioni (con custodia protettiva inserita)

Lunghezza142.0 mm
Larghezza78.0 mm
Profondità29.3 mm
Peso250 gr.

Schermo

Schermo a cristalli liquidi a matrice di punti; quattro linee di venti caratteri alfanumerici.

Tastiera

Trentasei tasti compresi i tasti editing, cursore, alfabetico, numerico, MODE e ON/CLEAR.

Microprocessore

HD6303X; frequenza di clock 3.6864 Mhz.

Memoria

ROM     64K
RAM     32K LZ     64K LZ64
EPROM Extra - Datapaks 8/16/32/64/128K
RAM Extra - Rampak 32K

Orologio

Orologio in tempo reale con quarzo a 32768 Hz.

DATAPAKS

Supporto fisico

EPROM (memoria a sola lettura, programmabile e cancellabile).

Durata di ritenzione dei dati

MTBF: 50 anni a 100 C

Formattazione

30 minuti coi Formattatore Psion. Riformattabili fino a 100 volte.

Capacità

8K Datapak 8192 bytes
16K Datapak 16384 bytes
32K Datapak 32768 bytes
64K Datapak 65536 bytes
128K Datapak131072 bytes
RAMPAKS

Supporto fisico

RAM con batteria di back-up.

Formattazione

Opzione Format in Altri

Capacità

32768 bytes

ALIMENTAZIONE

Batteria alcalina a 9 volt; è disponibile l'alimentatore da rete.

È politica commerciale della PSION lo sviluppare sempre nuovi prodotti; piccoli cambiamenti introdotti possono non essere indicati in questo manuale.


APPENDICE C
Programmazione tecnica

Indirizzi della memoria

Questi indirizzi vengono usati per certe variabili di sistema. Si accede ad esse con PEEKB, PEEKW, POKEB e POKEW. Dovreste usare questi comandi solo se sapete ciò che state facendo.

Indirizzo Default Funzione
$0069;$006A ($04) Contatore scorrimento orizzontale
$006B;$006C ($0A) Contatore scorrimento verticale
$0077 ($0E) Ritardo autoripetizione tastiera
$0078 ($00) Contatore autoripetizione tastiera
$007C non zero Segnalatore autospegnimento: un valore zero disattiva l'autospegnimento
$20CB;$20CC Contatore quadri: viene incrementato ogni 50 ms
$20CD;$20CE ($012C) Ritardo standard per l'autospegnimento
$00A4 ($00) Un valore non nullo disattiva il cicalino
$2099 ($F5) Bordatura doppia attivata
$20C0 ($01) Lunghezza
$20A7 ($1F) Imposte i bits per le sveglie feriali.
Default: $1F - da lun a ven
MSB LSB 1 | F 0 0 0 1 | 1 1 1 1 dom sat ven gio mer mar lun
MAPPA DELIA MEMORIA

L'Organiser Modello LZ ha 64K di ROM e 32K di RAM nella disposizione seguente. Il Modello LZ64ha due 16K RAM extra come indicato.

Memory map
NUMERI ESADECIMALI

Per ottenere un numero esadecimale nell'OPL, premettere un segno di $ - per esempio $FF è 255.

PROGRAMMAZIONE IN LINGUAGGIO MACCHINA

L'Organiser usa, come CPU (central Processor Unit) il microprocessore HD6303X. Quiesto processore, di moderna concezione, può essere programmato direttamente mediante un suo specifico linguaggio, detto linguaggio macchina o codice macchina.

I programmi scritti in linguaggio macchina vengono eseguiti molto più velocemente di quelli scritti in OPL e occupano minore memoria, ma sono, però, anche assai più difficili da scrivere e

da correggere. Inoltre, poichè un programma in linguaggio macchina prende il controllo di tutte le funzioni che la macchina può svolgere, anche un errore banale può portare alla distruzione di tutte le informazioni registrate nella memoria interna dell'Organiser.

Si suggerisce, pertanto, che nei caso si vogliano fare prove coi linguaggio macchina, tutte le informazioni presenti in memoria siano copiate su un Datapack in modo da poterle recuperare in caso di "disastro".


APPENDICE D
MESSAGGI DI ERRORE

I messaggi di errore sono riportati in ordine numerico. Se trovate difficile localizzare un messaggio poichè non ne conoscete il numero, cercate in quale pagina si trova consultando l'indice analitico. L'intrappolamento degli errori è trattato nel Capitolo 7.

192 ERR LETTURA DISP
Si verifica, di regola, quando un pack è difettoso o quando si tenta di fare una copia da un pack protetto o quando, ancora, si ha un errore sul Comms Link.

193 ERR SCRITT DISP
Si verifica, di regola, quando un pack è difettoso o quando si cerca di scrivere su un pack protetto. Si verifica anche quando, usando l'opzione Formatta di Altri, si cerca di formattare un Datapak al posto di un Rampak. Si verifica, infine, anche in caso di errore del Comms Link.

194 PILA SCARICA
La batteria è scarica. Spegnere e, per il cambio della batteria, vedere il Capitolo 1 del manuale d'uso.

195 VAL NUM SUPERATO
Sì è superato un estremo dell'intervallo consentito per i numeri interi (da -32768 a +32767).

196 ARCH NON APERTO
Si è cercato di leggere o di scrivere su un file che non è stato precedentemente aperto.

197 ERR NOME PROC
Si verifica quando, nell'opzione Nuovo del menu Prog, oppure nel menu Principale, si è usato un nome di procedura non corretto.

198 REC TROPPO LUNGO
Nessun record può superare i 254 caratteri.

199 ARCH IN USO
Si è cerato di aprire o di cancellare un file aperto.

200 ERR LETTURA PACK
No si riesce a leggere i dati registrati su un Datapack; quest'ultimo deve essere riformattato.

201 CAMPO ERRONEO
Si verifica quando una variabile campo non corrisponde a nessuna del file corrente.

202 FUNZ MENU LUNGA
La stringa passata alla funzione MENU è troppo lunga e va, pertanto, accorciata.

203 NO PROCEDURA
È stata chiamata una procedura che non esiste su nessun dispositivo.

204 NO VAR ESTERNA
Si è incontrata una variabile che non è stata dichiarata nè globale dalla procedura chiamante, nè globale o locale dalla procedura corrente.

205 ARG COUNT ERR
Sie passato ad una procedura un numero errato di argomenti.

206 INTERRUZIONE
Durante l'esecuzione di un programma, si è premuto il tasto ON/CLEAR, seguito dal tasto A, bloccando il programma.

207 ERR LISTA CAMPO
Un file deve contenere almeno uno campo e non ne può contenere più di 16. L'errore si verifica quando si tenta di violare questi limiti.

208 ERR ASSEGNAZIONE
Si è cercato di assegnare un valore d'una variabile di tipo sbagliato.

209 ERR NOME LOGICO
Si è usato un nome logico errato: ad esempio, diverso da A, B, C o D.

210 NO VIRGOLA
Si è tralasciata una virgola in una lista di voci che debbono essere separate tra loro con una virgola.

211 NO ETICHETTA
Si ù cercato di effettuare un GOTO ad un'etichetta che non esista nella procedure corrente.

212 STRUT COMPLESSA
Vi sono troppe strutture annidate all'interno di una struttura. Il numero massimo consentito è 8.

213 ERRATA STRUTTURA
Una struttura del tipo IF/ENDIF, WHlLE/ENDWH o DO/UNTIL è annidata in modo errato.

214 NOME DUPLICATO
Il nome assegnato ad un file o ad una procedura esiste già sul dispositivo corrente.

215 ERR MATRICE
Si è dichiarata una schiera con un numero non consentito di elementi; ad esempio, GLOBAL nome$(0, 15).

216 ERR DICHIARAZ
Una variabile è stata dichiarata in maniera errata; ad esempio, GLOBAL nome$(300) in cui la stringa nome$ supera la lunghezza consentita.

217 ERR NOME PROC
Si è richiamato un programma creato esternamente che non ha come prima riga un nome di procedura.

218 ERR NUMERO
Si è utilizzato un numero che non può essere valutato; ad esempio 2.3.4

219 ERR CARATTERE
In un'espressione da calcolare è presente un carattere non valido come, ad esempio, @.

220 STRINGA LUNGA
Si è tentato di utilizzare una stringa la cui lunghezza supera quella dichiarata nei comandi GLOBAL o LOCAL. Ad esempio: LOCAL a$(10) A$="123456789ABCDEF"

221 " ERRONEE
Si verifica quando le virgolette " non sono correttamente appaiate.

222 ERR IDENTIF
Si è utilizzato un nome di variabile scritto in modo errato; ad esempio, nome$$.

223 NOME LUNGO
Il nome di variabile, o di procedura o di file, ha un numero eccessivo di caratteri. Sono ammessi solo 8 caratteri al massimo, compresi i qualificatori % e $.

224 TIPO INCORRETTO
Si è assegnato un valore ad una variabile o a un parametro di una procedura di tipo errato; ad esempio, a$=12 o a="testo".

225 ERRORE DI INDICE
In una variabile a schiera si è trovato un "fuori limiti" di un indice; per esempio, a(0) o a(10), quando la schiera a() è stata dichiarata di 9 elementi.

226 ERR FUNZ ARG
Ad una funzione si è passato un argomento di valore o di tipo errato; ad esempio LOG(-1).

227 () ERRONEE
Si verifica quando le parentesi non sono correttamente appaiate.

228 ERR DI SINTASSI
Durante la traduzione di una procedura, si è identificato un errore di sintassi.

229 ERR CARICAMENTO
Un pack è stato rimosso durante la verifica da parte dell'Organiser, oppure è stato danneggiato.

230 DISP INESISTENTE
Si è tentato di accedere ad un dispositivo che non è presente. Per esempio, nel caso di una stampante, se questa non è collegata, un comando LPRINT produrrà il messaggio.

231 ERR RICH DISP
Si verifica quando si richiede da un dispositivo un'operazione non consentita.

232 PACK NO COPIABILE
Si è cercato di fare la copie di un pack protetto contro le copia.

233 DIRECTORY PIENA
Ciascun dispositivo può contenere fino ad un massimo di 110 file; si è cercato di creare un file che supera questo limite.

234 ARCH NON TROVATO
Si è cercato di accedere ad un file che non esiste sul dispositivo specificato.

235 ARCH ESISTENTE
Si è cercato di creare un file od una procedura con un nome che esiste già sul dispositivo specificato.

236 NOME ARCH ERRATO
Si e specificato un nome di file che non è conforme alle regole (Massimo 8 caratteri alfanumerici con il primo alfabetico).

237 TIPO RECORD ERRATO
Può verificarsi solo durante l'esecuzione di programmi scritti in linguaggio macchina.

238 FINE ARCHIVIO
Si verifica quando si tenta di leggere oltre l'ultimo record di un file.

239 PACK PIENO
Si è cercato di scrivere su un Datapak pieno.

240 PACK SCONOSCIUTO
Sì è montato un pack non riconosciuto dall'Organiser II.

241 PACK NON VERGINE
Il Datapak deve essere riformattare.

242 PACK CAMBIATO
Si verifica quando si richiamano routines del sistema operativo scritte in linguaggio macchina o quando si cambia il pack durante un COPIA.

243 ERR NOME DISP
Si è usato per un dispositivo un nome diverso da A, B o C.

244 PACK DI SOLO LETT
Si è cercato di scrivere su un pack di programmi: questi possono solo essere letti, mentre non è possibile scrivere su di essi.

245 ERR SCRITT PACK
L'Organiser non riesce a scrivere su un Datapak: provate a reinserirlo.

246 NO PACK
Il Datapak richiamato con istruzioni di OPEN, CREATE, ecc. non è stato montato oppure è stato smontato durante un accesso.

247 ERR FUNZ ARG
Ad una funzione o ad una procedura si è passato un argomento di tipo errato.

248 STACK SUPERATO
Si verifica quando un programma in linguaggio macchina distrugge la catasta dell'Organiser.

249 STACK SUPERATO
Coma sopra.

250 ERR NUM STR
Si verifica solo quando si richiama una routine del sistema operativo scritta in linguaggio macchina.

251 DIVISO PER ZERO
Si è tentata una divisione per zero.

252 STR NON NUMERICA
Alla funzione VAL si è passata una stringa non numerica.

253 MAX ESP AMMESSO
Un numero supera i limiti ammessi per l'esponente -99, +99.

254 FUORI MEMORIA
Si verifica quando la memoria della macchina è completamente occupata da programmi, agende e file, oppure quando il programma corrente ha utilizzato tutta la memoria disponibile.

255 SENZA DIREZIONE
Si può verificare solo quando si mandano in esecuzione routine in linguaggio macchina che accedono al buffer interno.


INDICE

" ERRONEE $ per variabili di stringa () ERRONEE

A

Abbandona ABS Sintassi ACOS Sintassi ADDR Sintassi AND Spiegazioni APPEND Sintassi Spiegazione ARCH IN USO ARCH NON APERTO ARCH ESISTENTE ARCH NON TROVATO ARG COUNT ERR ASC Sintassi ASCII Accedere ad un valore Accedere segno % ASIN Sintassi AT Sintassi ATAN Sintassi

B

BACK Sintassi BEEP Salti Sintassi BREAK Sintassi spiegazioni

C

Campi Gestione I nomi del campi Qualificatore CAMPO ERRONEO Cancellare Manu prog una procedura Carattere per accedere ASCII virgolette nelle stringhe Caratteri che non appaiono sulla tastiera definiti dall'utente Spiegazione di controllo CHR$ Sintassi Spiegazione Cicli No massimo senza fine Come evitarli CLOCK Sintassi CLOSE Sintassi Spiegazione CLS Sintassi COM estensione file CONTINUE Sintassi Conversione automatica del tipo tra var. numeriche e var. stringa Copia del menu principale Opzione Copiare Una procedura COPY Sintassi COPYW Estensioni file per Sintassi COS Sintassi COUNT Sintassi CREATE Sintassi Spiegazione CURSOR ON/OFF Sintassi

D

Data File Apertura di un Fila Datapaks Dati tecnici DATIM$ Sintassi DAY Sintassi Spiegazione DAYNAME$ Sintassi DAYS Sintassi DEG Sintassi DELETE Sintassi DELETEW Estensioni file per Sintassi DIA estensione file Dichiarare le variabili LOCAL e GLOBAL DIR$ Sintassi DIRECTORY PIENA DIRW$ Estensioni file per Sintassi DISP INESISTENTE DISP Sintassi DIVISO PER ZERO DO/UNTIL Sintassi Spiegazioni DOW Sintassi

E

EDIT Sintassi Editare Procedura EOF Sintassi ERASE Sintassi Spiegazione ERR ASSEGNAZIONE ERR CARATTERE ERR CARICAMENTO ERR DI SINTASSI ERR DICHIARAZ ERR FUNZ ARG ERR FUNZ ARG ERR IDENTIF ERR LETTURA DISPLAY ERR LETTURA PACK ERR LISTA CAMPO ERR MATRICE ERR NOME DISP ERR NOME LOGICO ERR NOME PROC ERR NOME PROC ERR NUM STR ERR NUMERO ERR RICH DISP ERR SCRITT DISP ERR SCRITT PACK ERR Sintassi Spiegazione ERR$ Sintassi ERRATA STRUTTURA ERRORE IN INDICE Errori Errori più comuni Generare errori In fase di esecuzione Intrappolamento degli errori Messaggi di errore ESCAPE OFF Rischi ESCAPE OFF/ESCAPE ON Sintassi Esempio Programmi Etichetta con GOTO Etichetta Comando ONERR EXIST Sintassi EXP Sintassi

F

File Agenda Programma esempio per gestione File dati Creazione Esempi prog. per gestione La gestione del file dati File di vario tipo Gestione FIND Sintassi Spiegazione FINDW Sintassi FINE ARCHIVIO FIRST Sintassi Spiegazione FIX$ Sintassi FLT Sintassi FREE Sintassi FUNZ MENU LUNGA FUORI MEMORIA

G

GEN$ Sintassi Gestione Campi GET in ASCII Sintassi Spiegazione GET$ Sintassi

GLOBAL Sintassi Spiegazione GOTO Sintassi Spiegazione

H

HEX$ Sintassi HOUR Sintassi

I

IABS Sintassi IF/ELSEIF/ELSE/ENDIF Sintassi Spiegazione Il menu prog Sommario Il segno % per variabile a virgola mobile Indirizzi della memoria Inizio Opzione menu OPL INPUT Nella routine esempi Sintassi INT Sintassi INTERRUZIONE INTF Sintassi Intrappolamento degli errori

K

KEY in ASCII Sintassi KEY$ Sintassi KSTAT Sintassi

L

LAST Spiegazione LEFT$ Sintassi Spiegazione LEN Sintassi LN Sintassi LOC Sintassi LOCAL Sintassi Spiegazione LOG Sintassi LOWER$ Sintassi LPRINT Sintassi

M

Mappa della memoria MAX ESP AMMESSO MAX Sintassi MEAN Sintassi Memorie della calcolatrice Variabile OPL MENU Sintassi MENUN Sintassi Messaggi di errore Microprocessore Dati tecnici MID$ Sintassi Spiegazione MIN Sintassi MINUTE Sintassi MONTH Sintassi MONTH$ Sintassi

N

NEXT Sintassi Spiegazione NO ETICHETTA NO PACK NO PROCEDURA NO VAR ESTERNA NO VIRGOLA NOME ARCH ERRATO Nome del file logico NOME DUPLICATO NOME LUNGO Nomi delle procedure Variabili NOT Spiegazioni NTS estensione file NUM$ Sintassi Numeri Esadecimali Nuovo

O

ODB estensione file OFF Sintassi ONERR Sintassi Spiegazione OPEN Sintassi Spiegazione Operatore logico con numeri a virgola mobile con valori interi Operatori aritmetici Operatori logici Operatori Precedenza OPL estensione file OPO estensione file OPT estensione file Orologio Dati tecnici

P

PACK CAMBIATO PACK DI SOLO LETT PACK NON COPIABILE PACK NON VERGINE PACK PIENO PACK SCONOSCiUTO PAG estensione file Parametri delle procedure Spiegazioni Multipli Return PAUSE Sintassi PEEKB Sintassi PEEKW Sintassi Peso dell'Organiser PI Sintassi PILA SCARICA PLN estensione file POKEB Sintassi POKEW Sintassi POS Sintassi Spiegazione POSITION Sintassi Spiegazione Pound sign Visualizzare PRINT Sintassi Spiegazione Procedura Abbandonare una procedura Cambiare il nome Copia Correggere Creare Esempi Introduzione Mandare in esecuzione dal menu principale Mandare in esecuzione Nome Parametri della Riprendere una vecchia Procedura Salva Stampa di una procedura Tradurre per un XP o per un CM Uscita da Programma Etichette Programmi Esempio Punto di domanda Visualizzare Punto e Virgola In OPL

R

RAD Sintassi RAISE Sintassi RANDOMIZE Sintassi REC TROPPO LUNGO Records Aggiungere un record ad un file Cambiare il record corrente Cancellare un record Ricerca di un record RECSIZE Sintassi REM Sintassi RENAME Sintassi REPT$ Sintassi RETURN Sintassi RIGHT$ Sintassi Spiegazione RND Sintassi Run Procedura

S

Salto nella procedura Salvare Procedura Schermo Dati tecnici SCI$ Sintassi SECOND Sintassi Segno di $ per numeri esadecimali SENZA DIREZIONE SIN Sintassi SPACE Sintassi SQR Sintassi STACK SUPERATO Stampa Procedura STD Sintassi STOP Sintassi STR NON NUMERICA STRINGA LUNGA Stringa Lunghezza massima Spiegazione Stringhe Carattere virgolette Concatenazione Segmentazione STRUT COMPLESSA SUM Sintassi

T

TAN Sintassi TIPO INCORRETTO TIPO RECORD ERRATO Trad Tradurre Procedura TRAP Sintassi Spiegazione Trova opzione menu OPL

U

UDG Sintassi Spiegazione Uso programma esempi (2) UPDATE Sintassi UPPER$ Sintassi USE Sintassi Spiegazione Uso della grafica definite Uso prog. esempi USR Sintassi USR$ Sintassi

V

VAL NUM SUPERATO VAL Sintassi VAR Sintassi Variabili a schiera a stringa Spiegazioni a virgola mobile Conversione automatica a virgola mobile intervallo range a virgole mobile Spiegazione di sistema Dichiarazione Spiegazione Es. schiera di interi Intera Intere Conversione automatica LOCAL e GLOBAL Operazioni sulle Spiegazione Stringa Virgola mobile VIEW Sintassi Virgola In OPL Visualizzare Pound sign Punto di domanda Vuota Opzione OPL

W

WEEK Sintassi WHILE/ENDWH Sintassi Spiegazioni

X

Xtrad opzione

Y

YEAR Sintassi


Part No: 6100-0083
VI Dec 89
Italian