16.06.2013 Views

2 - Amiga Magazine Online

2 - Amiga Magazine Online

2 - Amiga Magazine Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

sarli alla propria superclasse. In questo modo la classe si<br />

comporta come se possedesse contemporaneamente anche<br />

tutti i metodi delle sue superclassi fittizie.<br />

Una osservazione interessante è che questo sistema per-<br />

mette di supportare automaticamente anche i metodi che<br />

verranno definiti in versioni future delle superclassi, senza<br />

alcun bisogno di modificare o ricompilare la classe stessa.<br />

L'unico requisito indispensabile è che i valori numerici as-<br />

sociati ai metodi siano sempre distinti tra due diverse clas-<br />

si. Questa caratteristica è garantita per tutte le classi built-in<br />

di lntuition, e dovrebbe esserlo anche per quelle progettate<br />

da terze parti. I1 condizionale è d'obbligo perché, per evita-<br />

re conflitti di questo tipo, la Commodore aveva stabilito<br />

che gli sviluppatori di nuove classi pubbliche richiedessero<br />

al gruppo di West Chester l'assegnazione dei valori da usa-<br />

re per i nuovi metodi e per gli attributi. Un sistema simile<br />

era stato adottato dalla Electronic Arts per l'assegnazione<br />

dei chunk ID per i file IFE. Purtroppo il fallimento di Com-<br />

modore e il conseguente smantellamento del laboratorio ri-<br />

cerca ha costretto gli sviluppatori esterni a "inventare" dei<br />

numeri, facendo molta attenzione per evitare conflitti con<br />

tutte le classi già esistenti. Comunque, per quante precau-<br />

zioni si prendano, la mancanza di centralizzazione non<br />

può garantire l'assenza totale di conflitti di questo tipo.<br />

A cosa può servire un oggetto con due o più superclassi?<br />

Un esempio banale è un gadget simile al LISTVIEW-KIND<br />

della GadTools, che riporta in uno string gadget la selezio-<br />

ne corrente. Anziché creare due oggetti distinti e intercon-<br />

netterli manualmente ogni volta, può risultare più comodo<br />

creare una classe "strlistviewgclass" che ne incapsuli la ge-<br />

stione. Una classe di questo tipo dovrebbe implementare<br />

tutti i metodi e gli attributi delle classi "listviewgclass" e<br />

"strgclass".<br />

Tecniche di debug<br />

I1 debug di una classe Boopsi può essere pii1 difficoltoso<br />

rispetto a un programma qualsiasi. Le tecniche classiche di<br />

debug sono spesso inefficaci, perciò è necessario usare<br />

qualche accorgimento che permetta di trovare più facil-<br />

mente i bug.<br />

Innanzitutto, dal momento che alcuni metodi dei gadget<br />

vengono chiamati sotto il contesto dell'input.device, usan-<br />

do un normale debugger non è possibile bloccarne l'esecu-<br />

zione mediante l'inserimento dei breakpoint e tanto meno<br />

eseguire il codice un'istnizione per volta. I1 motivo è sem-<br />

plice: se 1'input.device si blocca, si blocca anche I'interfac-<br />

cia utente e non è più possibile controllare il debugger.<br />

La soluzione più semplice per questo problema consiste<br />

nell'usare un cross-debugger su un secondo computer che<br />

comunica con il primo tramite un cavo null-modem o un<br />

altro tipo collegamento bidirezionale. I1 cprx del SAS/C è<br />

probabilmente l'unica scelta possibile, sebbene abbia la<br />

tendenza a inchiodarsi quasi più spesso dei programmi che<br />

pretende di debuggare. Enforcer, Mungwall e gli altri t001<br />

di sviluppo canonici possono essere di aiuto soltanto se il<br />

loro output viene inviato a un terminale remoto, sempre<br />

via seriale.<br />

Non è neppure possibile scrivere informazioni di debug<br />

usando le normali f~~nzioni di I/O della dos.library, e tantomeno<br />

quelle della libreria standard del C, perché<br />

l'input.device è un task e non un processo, quindi non<br />

può usare funzioni della dos.library. Di nuovo, un terrninale<br />

remoto è la soluzione migliore.<br />

La libreria linkabile debug.lib contiene delle funzioni come<br />

kprintf( ), che permettono di ottenere facilmente un output<br />

formattato sulla seriale interna presente in tutti i modelli di<br />

<strong>Amiga</strong>. Se non si dispone di un computer da usare come<br />

terminale, è sempre possibile utilizzare la porta parallela<br />

linkando con la ddebug.lib [con due "d"]. Una comune<br />

stampante Centronics, collegata alla porta parallela, è adat-<br />

ta allo scopo.<br />

I1 file "Debug.hn, che trovate nei sorgenti che accompagna-<br />

no questo articolo, contiene qualche macro di uso genera-<br />

le. Durante la scrittura dei metodi conviene inserire il mag-<br />

gior numero possibile di controlli di validità sui parametri<br />

usando le inacro ASSERT( ) e CHECK-PTR( ). Queste ma-<br />

ero producono un output soltanto quando non viene sod-<br />

disfatta la condizione specificata oppure quando un punta-<br />

tore non è valido. i controlli vengono completamente eli-<br />

minati quando si compila senza opzioni di debug.<br />

Una causa molto comune di problemi con gli oggetti Boo-<br />

psi è l'overflow dello stack. I1 task input.device ha uno<br />

stack di soli 4 kb, che bastano a malapena per far girare un<br />

complesso network di oggetti che comunicano tra loro<br />

scambiandosi messaggi costruiti sullo stack. All'interno del<br />

dispatcher di un oggetto Boopsi evitate di dichiarare varia-<br />

bili automatiche di grandi dimensioni e di chiamare funzio-<br />

ni in modo ricorsivo. In caso di bisogno, è possibile esten-<br />

dere lo stack usando StackSwap( ). A<br />

Bibliografia<br />

- <strong>Amiga</strong> ROM Kmel Refmnce Manual: Librarie5 (3rd editioni<br />

- 3.1 Native Dewloper Toolkzt<br />

- Am&a Beyeloper CB 1. I<br />

- Boop.5i Refivence: htp://~~2c~.w..utah.edzr/-stucWhmp.ri.html

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!