# Inform e Glulx/appendici/Appendice C - Gli errori della compilazione

Inform e Glulx
Copertina Tutti i moduli · Sviluppo
* IntroduzioneInform e Glulx/Introduzione
* Cosa occorre per iniziareInform e Glulx/Cosa occorre per iniziare
** Compilatore, interprete e altro ancora
** L'installazione
** Perché IF-IDE?
** Per chi non vuole (o non può) usare IF-IDE e Windows Frotz 2002
* Le basi di Inform
** A cosa serve questo capitolo?Inform e Glulx/Le basi di Inform/A cosa serve questo capitolo?
** Benvenuto in InformInform e Glulx/Le basi di Inform/Benvenuto in Inform
** Le funzioniInform e Glulx/Le basi di Inform/Le funzioni
** Variabili numeriche e caratteri specialiInform e Glulx/Le basi di Inform/Variabili numeriche e caratteri speciali
** Un po' di matematica non guasta maiInform e Glulx/Le basi di Inform/Un po' di matematica non guasta mai
** Passaggio dei parametri e ritorno dei valoriInform e Glulx/Le basi di Inform/Passaggio dei parametri e ritorno dei valori
** L'input dei dati numerici: l'istruzione GetnumberInform e Glulx/Le basi di Inform/L'input dei dati numerici: l'istruzione Getnumber
** If (condition) then... else...Inform e Glulx/Le basi di Inform/If (condition) then... else...
** While e do... untilInform e Glulx/Le basi di Inform/While e do... until
** For, break e continueInform e Glulx/Le basi di Inform/For, break e continue
** L'utilizzo delle costantiInform e Glulx/Le basi di Inform/L'utilizzo delle costanti
** Switch... caseInform e Glulx/Le basi di Inform/Switch... case
** Salti ed etichetteInform e Glulx/Le basi di Inform/Salti ed etichette
** Caratteri e stringheInform e Glulx/Le basi di Inform/Caratteri e stringhe
** I vettoriInform e Glulx/Le basi di Inform/I vettori
** Le stringhe numericheInform e Glulx/Le basi di Inform/Le stringhe numeriche
** Le direttiveInform e Glulx/Le basi di Inform/Le direttive
** Il debuggingInform e Glulx/Le basi di Inform/Il debugging
* RUINS, l'avventura comincia
** Il grande altopiano (dalla padella alla brace)Inform e Glulx/RUINS, l'avventura comincia/Il grande altopiano (dalla padella alla brace)
** La cassa d'imballaggio (riuscirete a riempirla tutta)?Inform e Glulx/RUINS, l'avventura comincia/La cassa d'imballaggio (riuscirete a riempirla tutta)?
** Il fungo (velenoso o non velenoso)?Inform e Glulx/RUINS, l'avventura comincia/Il fungo (velenoso o non velenoso)?
** Chi ha paura del buio (gli insetti no di certo)?Inform e Glulx/RUINS, l'avventura comincia/Chi ha paura del buio (gli insetti no di certo)?
** La porta di pietra (gialla è più carina)Inform e Glulx/RUINS, l'avventura comincia/La porta di pietra (gialla è più carina)
** La chiave di pietra (così non si arruginisce)Inform e Glulx/RUINS, l'avventura comincia/La chiave di pietra (così non si arruginisce)
** Il primo tesoro (speriamo che non sia un anello)Inform e Glulx/RUINS, l'avventura comincia/Il primo tesoro (speriamo che non sia un anello)
** La maschera facciale (non di carnevale)Inform e Glulx/RUINS, l'avventura comincia/La maschera facciale (non di carnevale)
** Il ritorno della mummia (non è un film, è tutto vero)Inform e Glulx/RUINS, l'avventura comincia/Il ritorno della mummia (non è un film, è tutto vero)
** L'incrocio di Xibalbá (ma è davvero così pauroso)?Inform e Glulx/RUINS, l'avventura comincia/L'incrocio di Xibalbá (ma è davvero così pauroso)?
** La sfera di pietra pomice (avete indossato il casco)?Inform e Glulx/RUINS, l'avventura comincia/La sfera di pietra pomice (avete indossato il casco)?
** Una gabbia per un facocero (e l'archeologo che fine ha fatto)?Inform e Glulx/RUINS, l'avventura comincia/Una gabbia per un facocero (e l'archeologo che fine ha fatto)?
** La cripta dei nove signori della notte (o sette come i nani)?Inform e Glulx/RUINS, l'avventura comincia/La cripta dei nove signori della notte (o sette come i nani)?
** Un archeologo per un facocero (basta solo che non grugnite)Inform e Glulx/RUINS, l'avventura comincia/Un archeologo per un facocero (basta solo che non grugnite)
** La fine di RUINS è giunta (ma con Inform siete solo all'inizio)Inform e Glulx/RUINS, l'avventura comincia/La fine di RUINS è giunta (ma con Inform siete solo all'inizio)
* Inform e ancora Inform
** La Status LineInform e Glulx/Inform e ancora Inform/La Status Line
** I menuInform e Glulx/Inform e ancora Inform/I menu
** I labirinti e i nomi pluraliInform e Glulx/Inform e ancora Inform/I labirinti e i nomi plurali
** Il tempoInform e Glulx/Inform e ancora Inform/Il tempo
** I coloriInform e Glulx/Inform e ancora Inform/I colori
** I mezzi di trasportoInform e Glulx/Inform e ancora Inform/I mezzi di trasporto
** Su e giù con l'ascensoreInform e Glulx/Inform e ancora Inform/Su e giù con l'ascensore
** Gli NPC (o PNG in italiano)Inform e Glulx/Inform e ancora Inform/Gli NPC (o PNG in italiano)
** Le estensioni (o librerie aggiuntive)Inform e Glulx/Inform e ancora Inform/Le estensioni (o librerie aggiuntive)
** Varie, listati e decompilatoreInform e Glulx/Inform e ancora Inform/Varie, listati e decompilatore
* Inform e Glulx
** Cos'è GlulxInform e Glulx/Inform e Glulx/Cos'è Glulx
** L'installazione di JifInform e Glulx/Inform e Glulx/L'installazione di Jif
** La compilazioneInform e Glulx/Inform e Glulx/La compilazione
** L'esecuzioneInform e Glulx/Inform e Glulx/L'esecuzione
** Da Inform a GlulxInform e Glulx/Inform e Glulx/Da Inform a Glulx
** La grafica e il sonoroInform e Glulx/Inform e Glulx/La grafica e il sonoro
** L'allineamento delle immaginiInform e Glulx/Inform e Glulx/L'allineamento delle immagini
** Avventure senza graficaInform e Glulx/Inform e Glulx/Avventure senza grafica
** I colori e gli stili del testoInform e Glulx/Inform e Glulx/I colori e gli stili del testo
** La personalizzazione della Status LineInform e Glulx/Inform e Glulx/La personalizzazione della Status Line
** output dei datiInform e Glulx/Inform e Glulx/L'input/output dei dati
** VarieInform e Glulx/Inform e Glulx/Varie
** GULL, il manuale ufficialeInform e Glulx/Inform e Glulx/GULL, il manuale ufficiale
* Appendici
** Appendice A - Le azioni principaliInform e Glulx/appendici/Appendice A - Le azioni principali
** Appendice B - I messaggi della libreriaInform e Glulx/appendici/Appendice B - I messaggi della libreria
** Appendice C - Gli errori della compilazioneInform e Glulx/appendici/Appendice C - Gli errori della compilazione
** Appendice D - La soluzione di RuinsInform e Glulx/appendici/Appendice D - La soluzione di Ruins
** Appendice E - Come usare Windows Frotz 2002Inform e Glulx/appendici/Appendice E - Come usare Windows Frotz 2002
** Appendice F - Le mappeInform e Glulx/appendici/Appendice F - Le mappe
** Appendice G - Scrivere, distribuire e reperire delle avventure testualiInform e Glulx/appendici/Appendice G - Scrivere, distribuire e reperire delle avventure testuali
Modifica il sommario

## Appendice C - Gli errori della compilazione

La compilazione è quel processo che trasforma un file sorgente (nel caso di Inform il file contraddistinto dall’estensione .inf) in un file eseguibile (il file nel formato Z-code, ovvero l’avventura testuale stessa). Nonostante JIF e WIDE mettano a disposizione degli appositi tasti per effettuare quest’importantissima operazione, non sempre tutto va per il verso giusto (possono cioè verificarsi degli errori che impediscono la creazione del file eseguibile). Vediamo allora di elencare alcune regole per impedire che accada quest’evento (o perlomeno per evitare che accada spesso):
* ad ogni parentesi graffa aperta (, ne deve sempre corrispondere una chiusa); la stessa cosa vale per le parentesi tonde e quadre ([ ]). Questo è l’errore più tipico che si possa fare, e purtroppo è anche uno dei più difficili da trovare, perché il compilatore produce in genere una sfilza di errori che non hanno nulla a che vedere con quello che a noi interessa. Spesso poi, non bisogna fidarsi troppo dei numeri di riga, perché non è detto che l’errore sia sempre nelle righe corrispondenti, ma magari è nelle "vicinanze" (qualche riga più sopra o più sotto) o addirittura in qualche altra parte del programma. JIF, comunque, ci viene in aiuto con un’apposita funzione di controllo delle parentesi;
* ogni istruzione deve terminare (salvo alcune eccezioni) con un punto e virgola (;). Se questo simbolo viene omesso il compilatore genera, come nel punto 1, una sfilza di errori che non hanno nulla a che vedere con quello che a noi interessa;
* tutto quello che viene dichiarato deve sempre essere usato. Non si può cioè definire, ad esempio, una costante MAX e non usarla all’interno del programma. Il compilatore in questo caso genera sempre un messaggio di errore e lo stesso discorso vale anche per le variabili, le funzioni, gli oggetti, ecc.;
* tutto quello che non viene dichiarato non può essere usato. Non è possibile, cioè, cercare di utilizzare una variabile, una funzione, un oggetto o altro se non è stato prima dichiarato (o, per dirla in parole più semplici, creato);
* a parte rare eccezioni (riguardanti soprattutto alcune estensioni), il file eseguibile deve essere sempre creato senza le segnalazioni di warning. Esistono infatti due tipi di errori: quello più grave (indicato dal compilatore come Error ➨ impedisce la creazione del file eseguibile) e quello più "lieve" (indicato dal compilatore come Warning ➨ non impedisce la creazione del file eseguibile, ma può dare dei problemi durante lo svolgimento del gioco);
* se viene generata una lista di errori, occorre risolvere il primo e, dopo, tutti quelli che lo seguono. Nella maggior parte dei casi, infatti, alcuni errori nascono come conseguenza di quelli fatti prima. Risolti questi ultimi, anche gli altri scompaiono;
* non si può definire un nuovo verbo che è già esistente. Potete però ampliarne il significato tramite le istruzioni Extend e Extend only, come spiegato nel paragrafo 4.9;
* in Inform si possono usare, di default, solo i valori numerici compresi tra –32768 e 32767. Una variabile, cioè, può contenere solo un valore numerico compreso nel range sopra indicato. In caso contrario, il compilatore non genera un errore, ma i valori memorizzati in essa sono completamente diversi e casuali, con dei risultati totalmente imprevedibili;
* le librerie di sistema non si devono mai modificare. Vanno invece usate le apposite istruzioni per la modifica dei messaggi di default, delle azioni e della status line; in questo modo si evitano dei possibili errori e (soprattutto) non si violano i diritti di copyright (le librerie di sistema – quelle di Inform e quelle italiane – sono di proprietà dei rispettivi autori, e nessuno – salvo una loro precisa autorizzazione – può modificarle né tantomeno distribuirle);
* sebbene esistano diverse versioni della Z-machine, è vivamente consigliato usare la versione 5 (.z5) per le avventure testuali a lunghezza standard, e la versione 8 (.z8) per quelle più grosse. A volte (anche se raramente) è possibile trovare qualche gioco nella versione 6 (.z6) usata per supportare la grafica e il suono. Ma in questo caso è molto meglio usare Glulx, una virtual machine a 32 bit il cui compilatore supporta appieno le caratteristiche della (vecchia) Z-machine. In questo modo è possibile, per un programmatore Inform, compilare il suo programma anche per Glulx e accedere così alle istruzioni extra di quest’ultimo per ottenere una maggiore interattività dal punto di vista grafico e sonoro;
* Non potete usare l’istruzione include su un file che non esiste o che non si trova nella path library specificata di default nell’editor di testo. Nel caso ad esempio di WIDE, supponendo che il mio listato Inform contenga l’istruzione Include "Parser"; e che la path library di default sia "C:\Inform\Libraries", se al momento della compilazione il file Parser.h non si trova nella directory sopra specificata, il compilatore Inform genererà un errore che bloccherà l’operazione in corso;
* Tutto quello che viene dichiarato nel file di include, deve sempre essere utilizzato. Non posso, cioè, definire un’ipotetica variabile count dichiarata ad esempio nel file Variabili.h e non utilizzarla all’interno del listato. Questo perché quando inizia la fase di compilazione, il compilatore Inform riunisce tutti questi file "esterni" in un unico file che poi utilizza per creare (se non ci sono ovviamente degli errori) l’eseguibile;
* la status line, se usata, va sempre inizializzata. Per sapere come fare, consultate il paragrafo 5.1.
Occorre ora spendere qualche parola su un altro tipico errore "informiano":
generato, per esempio, dal seguente codice:
dove l’istruzione print non può essere presa in considerazione dal compilatore. Per far sì che questo non avvenga occorre aggiungere quest’istruzione anche alla riga sopra:
e il problema è risolto. Un altro caso in cui si può verificare quest’errore, è quando "sposto" di posizione una specifica istruzione:
Se l’istruzione location non si trova all’inizio della funzione Initialise (o, in questo caso, subito sotto la chiamata alla funzione TitlePage), il compilatore non riuscirà a "trovarla". Attenzione quindi all’ordine che date alle istruzioni delle vostre avventure!!!
Vi ricordo poi, che in fase di esecuzione potrebbero verificarsi degli errori che per il compilatore non esistono. Questi sono i tipici casi in cui il programmatore scambia, ad esempio, il nome di una stanza per un altro, oppure assegna un valore sbagliato (ad esempio 3 al posto di 2) ad una variabile locale. Per il compilatore va tutto bene (non sono cioè presenti errori di sintassi), ma i risultati non sono ovviamente quelli voluti; in questi casi si può ricorrere alla forzatura dell’esecuzione del gioco, come accade nel seguente esempio:
Se voglio testare direttamente la Sala Quadrata con tutti gli oggetti della cassa da imballaggio nell’inventario del giocatore, stabilisco Square_Chamber come nuova locazione di partenza, sposto la macchina fotografica e il giornale nell’inventario dell’archeologo, libero il passaggio dalle macerie e rimuovo il fungo. Ecco il risultato:
In questo modo, è possibile testare ogni singola parte del gioco, riuscendo così a capire dove si verificano gli errori più "profondi".
Per i programmatori più esperti, Inform mette a disposizione delle specifiche istruzioni che permettono di controllare il processo di compilazione (le direttive, inizianti tutte con il carattere # e descritte nel paragrafo 3.17). Dei loro esempi di utilizzo potete trovarli nei listati avventura.inf e negozio.inf, oppure, si può sempre dare un’occhiata al listato di "La pietra della luna", la bellissima avventura testuale scritta da Paolo Lucchesi.
Non mi resta che augurare una buona compilazione a tutti...

## Note

* ↑ In realtà, i file codificati in questo formato non sono dei veri e propri file eseguibili (che sono invece contraddistinti dall’estensione .exe); questo perché i file nel formato Z-code hanno bisogno, per essere eseguiti, di un programma chiamato interprete (mentre un file eseguibile si avvia da solo, senza nessun programma aggiuntivo). Gli interpreti variano a seconda del sistema operativo usato e su Windows il più famoso è sicuramente Windows Frotz 2002 di David Kinder. Per ulteriori informazioni, consultate il capitolo 2.
* ↑ Ad esempio #C:\Jif\games\Ruins.inf(59): Warning: Defined constant "MAX" declared but not used che qui è proprio alla riga 59 ma, lo ripeto per l’ennesima volta, non è sempre così.
* ↑ Un esempio di messaggio per questo tipo di errore è #C:\Jif\games\Ruins.inf(1059): Error: Two different verb definitions refer to "prendi" dove si è cercato di definire, mediante l’istruzione Verb, il verbo prendi che esiste già in Infit.
* ↑ Con questo termine s’intende la barra in alto che compare nella finestra di Windows Frotz 2002 (o in qualsiasi altro interprete Z-code) quando iniziate a giocare un’avventura testuale. Per ulteriori informazioni, consultate il capitolo 5.
* ↑ Occorre ricordare che Infit (così come Jif) supporta appieno anche Glulx, e che i giochi in questo formato devono essere eseguiti dal programma WinGlulxe. Ulteriori informazioni potete trovarle nel capitolo 6.