Domenico IEVA


consulente CAD & CG
 
Per coloro che non vogliono cimentarsi con i nuovi prodotti di aiuto alla programmazione, come Vital Lisp e Visual LISP, ma vogliono continuare a sviluppare con 'agilità' routines AutoLISP per AutoCAD, ecco un semplice programma di aiuto al 'debug' .
 Uno strumento di debug: ddDEBUG

Per riuscire a trovare la causa di un errore in un programma è necessario verificare a volte passo a passo le istruzioni, controllando che ogni variabile, ogni risultato sia quello previsto e che non contrasti con le istruzioni successive.

Quante volte sarà capitato a programmatori alle prime esperienze di passare ad una funzione un argomento di tipo sbagliato, ad esempio (atoi 5) invece che (atoi "5").

Non essendoci all’interno di AutoCAD un ‘debugger’, escludendo prodotti di terze parti ed il recente Visul LISP, per ispezionare lo stato delle variabili durante il corso del programma si adotta la classica tecnica di far stampare il valore di queste a video, per poi capire in quale parte del programma si commette l’errore, ad esempio:

...

(setq x(nth 1 lista)) ï la variabile x viene inizializzata

(print x)ï stampa a video il valore di x

(grread) ï eventuale pausa per leggere il risultato

...

 Il programma che presentiamo, ddDEBUG, adotta lo stesso principio solo che grazie all’utilizzo dei dialog box, riesce ad offrire alcuni vantaggi quali:

In pratica il flusso del programma principale viene momentaneamente ‘stoppato’ dalla funzione (ddd) che ci permette di valutare lo stato delle variabili grazie al dialog box composto semplicemente da 2 edit_box e da un button.
il riquadro di dialogo di ddDebug

 

Il primo edit_box serve ad immettere il nome della variabile oppure dell’espressione che si desidera valutare; ad esempio si potrebbe immettere ‘pi’ oppure un’espressione tipo (car(nth 3 lista)).

Premendo il tasto invio il programma valuta il contenuto dell’edit_box (con la funzione Valuta) e poi visualizza il valore o il risultato nel secondo edit_box, quello centrale, in realtà sarebbe stato più giusto adoperare un elemento TEXT per visualizzare il risultato ma con un edit_box è possibile eseguire uno scroll laterale e quindi di consultare risultati più lunghi (pensiamo ad una lista con molti elementi).

Infine un button ed una altro edit_box permettono di re-inizializzare la variabile con un nuovo valore (funzione Nuovoval) in modo che l’esecuzione del programma continui con la variabile settata con un valore noto.

Per richiamare la funzione ddDebug scrivere appena dopo le istruzioni sospette (ddd) così:

...

(setq x(nth 1 lista)) ï la variabile x viene inizializzata

(ddd) ï funzione per richiamare ddDebug

...

 Ma analizziamo il programma, peraltro semplicissimo. Una prima funzione, Valuta, ha il compito di valutare appunto la stringa passatagli come argomento e scriverla nel secondo edit_box:

(eval (read #a)) il risultato viene scritto in un file così poi, rileggendolo, potrà essere gestito come stringa (unico tipo di dato accettato dagli elementi dei dcl) quindi: (prin1 (eval (read #a)) #fi) Basta un read-line per inizializzare il secondo edit_box (quello con la key = "e2") (set_tile "e2" (read-line #fi))

 

Ancora più breve e semplice la funzione Nuovoval che, dopo aver verificato che

la stringa presente nel primo edit_box sia valida per essere utilizzata come

nome di simbolo

(if (= ‘SYM (type (read (get_tile "e1")))) le assegna il valore immesso nel terzo edit_box utilizzando la funzione set (set (read (get_tile "e1")) (read new)) Ricordate che per assegnare una stringa si dovranno racchiudere i caratteri tra virgolette ("").

La funzione può anche essere utile richiamarla da linea di comando per questo definiamo in coda al programma un nuovo command ‘c:’:

(defun c:ddd () (ddd))


// DEBUG.DCL
dddebug: dialog
      { label = "* DD D e b u g *";
            initial_focus = "e1";
            :edit_box{ label = "espressione/variabile:" ; key = "e1"; edit_width = 12;}
            :boxed_column {
                :text { label = "valore:"; }
                :edit_box{ key = "e2";}
            }
            :boxed_row {
                :button {label = "Assegna nuovo valore:"; key = "nv"; mnemonic = "A";}
                :edit_box {key = "e3"; edit_width = 12;} 
            }
            ok_only;
      }










*Download file: dddebug.zip ( 1 kb) *