Inform e Glulx/Le basi di Inform/I vettori: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Gian BOT (discussione | contributi)
m Bot: sostituzione tag obsoleti
Riga 5:
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
Riga 39:
Include "ItalianG";
 
All’inizio, il vettore <ttcode>numeri</ttcode> si presenta così:
 
{| style="width:100%; background:trasparent"
| align="center" |
{| class="wikitable"
| align=center|&nbsp;&nbsp;<ttcode>0</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>1</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>2</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>3</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>4</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>5</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>6</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>7</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>8</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>9</ttcode>&nbsp;&nbsp;
|-
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>?</ttcode>&nbsp;&nbsp;
|}
|}
 
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|&nbsp;&nbsp;<ttcode>'''i'''</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>0</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>1</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>2</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>3</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>4</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>5</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>6</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>7</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>8</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>9</ttcode>&nbsp;&nbsp;
|-
| align=center|&nbsp;&nbsp;<ttcode>'''the_array->i'''</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>1</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>2</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>3</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>4</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>5</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>6</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>7</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>8</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>9</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;<ttcode>10</ttcode>&nbsp;
|}
|}
 
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
Riga 133:
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|]]
Riga 162:
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ì:
Riga 171:
| align="center" |
{| class="wikitable"
| align=center|&nbsp;&nbsp;<ttcode>0</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>1</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>2</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>3</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>4</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>5</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>6</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>7</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>8</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>9</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>10</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;<ttcode>...</ttcode>&nbsp;
|-
| align=center|&nbsp;&nbsp;<ttcode>0</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;<ttcode>23</ttcode>&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>M</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>a</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>s</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>s</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>i</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>m</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>o</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;
| align=center|&nbsp;&nbsp;<ttcode>è</ttcode>&nbsp;&nbsp;
| align=center|&nbsp;<ttcode>...</ttcode>&nbsp;
|}
|}
 
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:
 
Riga 233:
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?
 
Riga 274:
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:
 
Riga 314:
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> &nbsp;&#x27A8;&nbsp; <ttcode>nome_player->2</ttcode>).
 
[[Immagine:Inform e Glulx-sp.gif|centre|435 px|]]
Riga 359:
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;
Riga 369:
];
 
<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 ==