Vi siete rilassati? Ok. '''Un [[w:Array|vettore]] può essere considerato come un insieme di variabili indicizzate''' e in Inform può essere definito in questo modo:
<ttcode>Array nome_array->lunghezza_max_array;</ttcode>
Scrivendo ad esempio <ttcode>Array numeri->20;</ttcode> abbiamo a disposizione 20 celle (che equivalgono di fatto a delle variabili) alle quali è possibile accedere tramite un indice:
! Esempio sull'utilizzo dei vettori numerici - versione 1
Include "ItalianG";
All’inizio, il vettore <ttcode>numeri</ttcode> si presenta così:
{| style="width:100%; background:trasparent"
| align="center" |
{| class="wikitable"
| align=center| <ttcode>0</ttcode>
| align=center| <ttcode>1</ttcode>
| align=center| <ttcode>2</ttcode>
| align=center| <ttcode>3</ttcode>
| align=center| <ttcode>4</ttcode>
| align=center| <ttcode>5</ttcode>
| align=center| <ttcode>6</ttcode>
| align=center| <ttcode>7</ttcode>
| align=center| <ttcode>8</ttcode>
| align=center| <ttcode>9</ttcode>
|-
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
| align=center| <ttcode>?</ttcode>
|}
|}
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 <ttcode>LoadArray</ttcode> ecco come si ripresenta il nostro vettore:
{| style="width:100%; background:transparent"
| align="center" |
{| class="wikitable"
| align=center| <ttcode>'''i'''</ttcode>
| align=center| <ttcode>0</ttcode>
| align=center| <ttcode>1</ttcode>
| align=center| <ttcode>2</ttcode>
| align=center| <ttcode>3</ttcode>
| align=center| <ttcode>4</ttcode>
| align=center| <ttcode>5</ttcode>
| align=center| <ttcode>6</ttcode>
| align=center| <ttcode>7</ttcode>
| align=center| <ttcode>8</ttcode>
| align=center| <ttcode>9</ttcode>
|-
| align=center| <ttcode>'''the_array->i'''</ttcode>
| align=center| <ttcode>1</ttcode>
| align=center| <ttcode>2</ttcode>
| align=center| <ttcode>3</ttcode>
| align=center| <ttcode>4</ttcode>
| align=center| <ttcode>5</ttcode>
| align=center| <ttcode>6</ttcode>
| align=center| <ttcode>7</ttcode>
| align=center| <ttcode>8</ttcode>
| align=center| <ttcode>9</ttcode>
| align=center| <ttcode>10</ttcode>
|}
|}
Nel ciclo <ttcode>for</ttcode> di questa funzione, alla variabile <ttcode>i</ttcode> viene assegnato l’indice e l’istruzione:
<ttcode>the_array->(i - 1) = i;</ttcode>
fa riferimento alla cella corrispondente dell’indice <ttcode>(i – 1)</ttcode>, e le assegna il valore della variabile <ttcode>i</ttcode>.
Ricordatevi sempre che '''in Inform, l’indice della prima cella di un vettore non è 1, ma 0'''. Ecco perché ho messo <ttcode>(i – 1)</ttcode> al posto di <ttcode>i</ttcode>: 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 <ttcode>numeri</ttcode> sia inizializzato al momento della sua dichiarazione:
! Esempio sull'utilizzo dei vettori numerici - versione 2
Include "ItalianG";
In questo modo, la funzione <ttcode>LoadArray</ttcode> non serve più, mentre la costante <ttcode>LUNGH_MAX</ttcode> continua a fungere da parametro all’istruzione <ttcode>PrintNumericArray</ttcode> (che, come dovreste ormai aver capito, stampa a video il contenuto di un vettore numerico).
[[Immagine:Inform e Glulx-sp.gif|centre|435 px|]]
Include "ItalianG";
abbiamo ora un vettore <ttcode>nome</ttcode> di tipo stringa che dopo l’istruzione:
<ttcode>Array nome buffer "Massimo è andato a casa";</ttcode>
si presenta così:
| align="center" |
{| class="wikitable"
| align=center| <ttcode>0</ttcode>
| align=center| <ttcode>1</ttcode>
| align=center| <ttcode>2</ttcode>
| align=center| <ttcode>3</ttcode>
| align=center| <ttcode>4</ttcode>
| align=center| <ttcode>5</ttcode>
| align=center| <ttcode>6</ttcode>
| align=center| <ttcode>7</ttcode>
| align=center| <ttcode>8</ttcode>
| align=center| <ttcode>9</ttcode>
| align=center| <ttcode>10</ttcode>
| align=center| <ttcode>...</ttcode>
|-
| align=center| <ttcode>0</ttcode>
| align=center| <ttcode>23</ttcode>
| align=center| <ttcode>M</ttcode>
| align=center| <ttcode>a</ttcode>
| align=center| <ttcode>s</ttcode>
| align=center| <ttcode>s</ttcode>
| align=center| <ttcode>i</ttcode>
| align=center| <ttcode>m</ttcode>
| align=center| <ttcode>o</ttcode>
| align=center|
| align=center| <ttcode>è</ttcode>
| align=center| <ttcode>...</ttcode>
|}
|}
La cella numero 2 (<ttcode>nome->1</ttcode>) contiene il numero 23 che corrisponde alla lunghezza della stringa in esso contenuta. La stringa vera e propria comincia quindi dalla cella successiva (<ttcode>nome->2</ttcode>).
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 <ttcode>nome</ttcode> più stringhe?<br>
Osserviamo l’esempio che segue:
Include "ItalianG";
Come potete facilmente vedere, è l’istruzione <ttcode>PrintToBuffer</ttcode> che effettua l’assegnamento da noi voluto. <ttcode>PrintToBuffer</ttcode> ha però bisogno di tre parametri obbligatori: il ''nome dell’array'' (<ttcode>nome</ttcode>), la sua ''lunghezza'' (la costante <ttcode>LUNGH_MAX</ttcode> o, se preferite, 33) e la ''stringa vera e propria'' racchiusa tra le virgolette.<br>
'''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?
Include "ItalianG";
L’istruzione <ttcode>ReadArray</ttcode> da me scritta, definita nel file <ttcode>Io.h</ttcode> (che contiene a sua volta anche le istruzioni <ttcode>CmpStr</ttcode> e <ttcode>PrintStringArray</ttcode>), è quella che permette l’inserimento in input di una stringa da parte dell’utente <ref>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.</ref>. La riga <ttcode>ReadArray(nome_player, LUNGH_MAX);</ttcode> 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 <ttcode>CmpStr</ttcode> confronta due stringhe e restituisce il valore 1 se sono uguali, 0 se invece non lo sono. La riga <ttcode>CmpStr(nome_player, nome_computer);</ttcode> 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 <ttcode>nome_computer</ttcode> viene passata la stringa "<ttcode>massimo</ttcode>" anziché "<ttcode>Massimo</ttcode>"?<br>
Dovete sapere che l’istruzione <ttcode>ReadArray</ttcode> (o meglio, l’istruzione <ttcode>KeyboardPrimitive</ttcode> usata da <ttcode>ReadArray</ttcode>), trasforma automaticamente tutte le lettere maiuscole in minuscole. Se l’utente digita quindi "<ttcode>Mario</ttcode>", il vettore <ttcode>nome_player</ttcode> conterrà "<ttcode>mario</ttcode>" anziché "<ttcode>Mario</ttcode>". 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.<br>
Ecco allora come risolvere il problema:
Include "ItalianG";
basta usare l’istruzione <ttcode>UpperCase</ttcode> passandole come parametro la lettera iniziale della stringa digitata dall’utente (contenuta a sua volta nella terza cella del vettore <ttcode>nome_player</ttcode> ➨ <ttcode>nome_player->2</ttcode>).
[[Immagine:Inform e Glulx-sp.gif|centre|435 px|]]
Include "ItalianG";
la funzione <ttcode>ChangeStringArray</ttcode> cambia le lettere "<ttcode>a</ttcode>" e "<ttcode>s</ttcode>" della parola "<ttcode>Massimo</ttcode>", scegliendo a caso fra le lettere "<ttcode>e</ttcode>", "<ttcode>i</ttcode>", "<ttcode>u</ttcode>" per mezzo dell’istruzione <ttcode>random</ttcode>. Quest’ultima, è anche in grado di generare dei numeri casuali come nel seguente esempio:
[Funz_princip a count;
];
<ttcode>a</ttcode> può valere un numero a caso compreso tra 1 e 6; un’efficace simulazione del lancio di un dado.<br>
L’istruzione <ttcode>ReadChar</ttcode> (definita anch’essa nel file <ttcode>Io.h</ttcode>) legge un carattere inserito dall’utente proprio come nell’istruzione <ttcode>Presskey</ttcode> ma, a differenza di quest’ultima, deve essere seguito dalla pressione del tasto Invio<ref>Cliccate [http://www.vincenzoscarpa.it/inform/manuale/Capitolo3_esercizi.zip 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''').</ref>.
== Note ==
|