# Inform e Glulx/Le basi di Inform/I vettori

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

## I vettori

Se siete riusciti ad arrivare vivi fino a qui, devo farvi davvero i miei complimenti. Adesso però, prima di affrontare l’argomento di questo paragrafo, vi consiglio vivamente di bere un po’ d’acqua, rilassarvi completamente e magari uscire per un paio d’ore con la vostra moglie o fidanzata (e se siete dei single con qualche amica: non si sa mai, potrebbe nascere una nuova relazione amorosa).
Vi siete rilassati? Ok. Un vettore può essere considerato come un insieme di variabili indicizzate e in Inform può essere definito in questo modo:
Array nome_array->lunghezza_max_array;
Scrivendo ad esempio Array numeri->20; abbiamo a disposizione 20 celle (che equivalgono di fatto a delle variabili) alle quali è possibile accedere tramite un indice:
All’inizio, il vettore numeri si presenta così:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
abbiamo 10 celle che devono ancora essere inizializzate (non sappiamo quindi cosa contengono, da qui il "?"). I numeri che vanno da 0 a 9 sono gli indici delle celle (uno per ogni cella). Dopo la chiamata alla funzione LoadArray ecco come si ripresenta il nostro vettore:
| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| the_array->i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Nel ciclo for di questa funzione, alla variabile i viene assegnato l’indice e l’istruzione:
the_array->(i - 1) = i;
fa riferimento alla cella corrispondente dell’indice (i – 1), e le assegna il valore della variabile i. Ricordatevi sempre che in Inform, l’indice della prima cella di un vettore non è 1, ma 0. Ecco perché ho messo (i – 1) al posto di i: se non lo avessi fatto, il contenuto della decima cella sarebbe stato 9 anziché 10.
Volendo semplificare un po’ le cose, possiamo fare in modo che il vettore numeri sia inizializzato al momento della sua dichiarazione:
In questo modo, la funzione LoadArray non serve più, mentre la costante LUNGH_MAX continua a fungere da parametro all’istruzione PrintNumericArray (che, come dovreste ormai aver capito, stampa a video il contenuto di un vettore numerico).
Ecco adesso, un esempio che usa un vettore con le stringhe:
abbiamo ora un vettore nome di tipo stringa che dopo l’istruzione:
Array nome buffer "Massimo è andato a casa";
si presenta così:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... |
| 0 | 23 | M | a | s | s | i | m | o | | è | ... |
La cella numero 2 (nome->1) contiene il numero 23 che corrisponde alla lunghezza della stringa in esso contenuta. La stringa vera e propria comincia quindi dalla cella successiva (nome->2). Nell’esempio appena visto, abbiamo assegnato una stringa a un vettore al momento della dichiarazione di quest’ultimo. Tuttavia, in un programma vero e proprio (e quindi in un’avventura testuale), difficilmente si utilizza un vettore una sola volta. Come si può, cioè, far sì che sia possibile assegnare al vettore nome più stringhe?
Osserviamo l’esempio che segue:
Come potete facilmente vedere, è l’istruzione PrintToBuffer che effettua l’assegnamento da noi voluto. PrintToBuffer ha però bisogno di tre parametri obbligatori: il nome dell’array (nome), la sua lunghezza (la costante LUNGH_MAX o, se preferite, 33) e la stringa vera e propria racchiusa tra le virgolette. Ricordatevi sempre che non potete mai usare una stringa che superi la lunghezza massima del vettore destinato a contenerla; dovete inoltre aggiungere 3 numeri alla lunghezza massima della vostra stringa fino a un massimo di 160 caratteri. In poche parole, in questo esempio non potete inserire una stringa lunga più di 30 caratteri, e la lunghezza del vettore che la deve contenere deve essere 33 su un massimo di 160. Piuttosto complicato, non è vero?
Vediamo ora, come fare in modo che sia l’utente a inserire una stringa:
L’istruzione ReadArray da me scritta, definita nel file Io.h (che contiene a sua volta anche le istruzioni CmpStr e PrintStringArray), è quella che permette l’inserimento in input di una stringa da parte dell’utente. La riga ReadArray(nome_player, LUNGH_MAX); chiama quindi questa istruzione passandole, come parametri, il nome dell’array che deve contenere la stringa dell’utente e la sua lunghezza massima. L’istruzione CmpStr confronta due stringhe e restituisce il valore 1 se sono uguali, 0 se invece non lo sono. La riga CmpStr(nome_player, nome_computer); chiama quindi questa istruzione passandole, come parametri, i nomi degli array contenenti le due stringhe da confrontare. Occorre però notare ancora una cosa: perché al vettore nome_computer viene passata la stringa "massimo" anziché "Massimo"?
Dovete sapere che l’istruzione ReadArray (o meglio, l’istruzione KeyboardPrimitive usata da ReadArray), trasforma automaticamente tutte le lettere maiuscole in minuscole. Se l’utente digita quindi "Mario", il vettore nome_player conterrà "mario" anziché "Mario". Di per sé il problema non sarebbe tanto grave, se non fosse per il fatto che due righe più sotto il nome dell’utente viene stampato a video insieme a quello del computer. Ecco allora come risolvere il problema:
basta usare l’istruzione UpperCase passandole come parametro la lettera iniziale della stringa digitata dall’utente (contenuta a sua volta nella terza cella del vettore nome_player ➨ nome_player->2).
Concludiamo il paragrafo con quest’ultimo programma:
la funzione ChangeStringArray cambia le lettere "a" e "s" della parola "Massimo", scegliendo a caso fra le lettere "e", "i", "u" per mezzo dell’istruzione random. Quest’ultima, è anche in grado di generare dei numeri casuali come nel seguente esempio:
a può valere un numero a caso compreso tra 1 e 6; un’efficace simulazione del lancio di un dado. L’istruzione ReadChar (definita anch’essa nel file Io.h) legge un carattere inserito dall’utente proprio come nell’istruzione Presskey ma, a differenza di quest’ultima, deve essere seguito dalla pressione del tasto Invio.

## Note

* ↑ In Inform esiste anche un modo più semplice per chiedere in input una stringa da parte dell’utente, come spiegato alla fine del paragrafo successivo.
* ↑ Cliccate qui per scaricare i listati degli esercizi (i file 3.15_1.inf, 3.15_2.inf, 3.15_3.inf, 3.15_4.inf, 3.15_5.inf, 3.15_6.inf, 3.15_7.inf).