Debugging ed errori comuni |
Come ogni linguaggio di programmazione, anche Proteus richiede un po' di attenzione nella stesura dei programmi. In particolare, essendo un linguaggio strutturato, sono valide considerazioni analoghe a quelle che si possono fare relativamente a linguaggi come C e Pascal.
Poiché non esiste un debugger per poter seguire l'esecuzione dei programmi passo-passo, è necessario modellare il programma in modo da stampare a video lo stato delle variabili di interesse in un determinato punto dell'esecuzione. Un sistema molto semplice per ottenere una lista completa dei valori degli identificatori pubblici in un dato momento è l'impiego del metodo DEBUG, che stampa tutti i valori nelle tre interpretazioni possibili (stringa, numero intero, numero in virgola mobile). Questo metodo non permette la visualizzazione delle variabili locali e non accede ai valori nelle strutture dati (code, pile, vettori, ecc.); per verificare singoli valori, si utilizzino CONSOLE o CONSOLELN.
Dal momento che è possibile scrivere cicli che non terminano mai, si dovrebbe porre particolare attenzione alle condizioni di uscita da essi e prevedere qualche meccanismo di emergenza, come questo:
; Non siamo certi che il ciclo termini sempre - forziamo l'uscita dopo 10 ; secondi dall'entrata ExitTime = ADD(CLOCK(), 10) WHILE Test ... IF GT(CLOCK(), ExitTime) BREAK FI LOOP
Un errore comune è l'utilizzo del carattere '\' nelle stringhe senza considerare l'espansione delle costanti C-like; ad esempio il seguente path di Ms-Dos è errato:
PathName = "C:\DOS\ATTRIB.EXE"
Infatti è interpretato in questo modo: C:[0]DOS[10]TTRIB.EXE, dove [0] e [10] indicano i caratteri ASCII 0 e 10. La scrittura corretta è la seguente:
PathName = "C:\\DOS\\ATTRIB.EXE"
Un altro errore comune è confondere le funzioni di confronto stringa con le funzioni di confronto numerico; le prime hanno prefisso STR: STREQ, STRNEQ, mentre le seconde non hanno prefisso: EQ, NEQ.
Anche le funzioni logiche possono essere confuse con le operazioni binarie (che hanno prefisso comune N); l'AND binario di due numeri si ottiene con NAND, la controparte logica con AND; lo stesso vale per or, xor, not.
I side-effects (effetti collaterali) sono anch'essi causa di frequenti errori; ad esempio, se si richiama la funzione REXMATCH all'interno di una UDF, bisogna considerare che gli identificatori predefiniti R_START ed R_LENGTH sono modificati di conseguenza all'esterno della funzione.
Un errore di sintassi frequente per chi si avvicina per la prima volta a Proteus è quello di aggiungere parentesi non richieste, come in questo caso:
IF (OS) CONSOLELN "Sistema operativo rilevato: Ms-Dos o Windows" FI
Al momento dell'esecuzione, Proteus segnala un errore sulle parentesi alla linea contenente l'IF;
infatti, le parentesi in Proteus sono utilizzate solo per
definire le funzioni, in quanto l'ordine delle operazioni è
determinato implicitamente.
IF, WHILE, SWITCH e FOR, al contrario del
C,
non richiedono parentesi nelle loro condizioni.
Un altro errore molto frequente è l'utilizzo del metodo SET al posto di PSET in una UDF per aggiornare una variabile pubblica, oppure la dimenticanza della funzione PUB prefissa ad un identificatore in una funzione definita dall'utente.
Esempi.
; Errore! MONTHS, essendo impostato con SET, è variabile locale alla ; funzione ONSTART; la variabile pubblica MONTHS resta immodificata e quindi ; la funzione ONSTART non ha alcun effetto FUNCTION ONSTART MONTHS = "Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic" RETURN ; Errore! R_START ed R_LENGTH non sono dentro PUB, per cui (non essendo state ; inizializzate prima dell'utilizzo) causano l'uscita anomala del programma
FUNCTION GetTag(s) IF REXMATCH(s, "<.*>") RETURN SUBSTR(s, R_START, R_LENGTH) FI RETURN ""
Per finire, alcuni consigli:
Inizio pagina | Prossimo argomento | Argomento precedente | Indice per argomenti | Indice analitico |