Newsgroup: it.comp.giochi.avventure.testuali
Titolo: Controllo stringhe in Inform

Qualcuno di voi sa come è possibile testare il contenuto di una
stringa?
Fare cioé una cosa del tipo:
IF X=="BIANCO" then print "Giallo";
Può sembrare una cosa banale, ma in Inform non riescio memorizzare una
stringa nella variabile. E' possibile secondo voi?
Grazie e ciao
Vincenzo

 IF X=="BIANCO" then print "Giallo";
Non conosco Inform, ma in C le stringhe sono array di caratteri, quindi ti
serve un ciclo.
Kiuhnm



Si', anche in Inform è la stessa cosa. Come faresti tu in C?
Grazie
Vincenzo

> Si', anche in Inform è la stessa cosa. Come faresti tu in C?
if (strcmp(X, "BIANCO") == 0) {
   ...
}
Ma Inform e' cosi' a basso livello?? Un giorno o l'altro andro' a 
leggermi il manuale...
   .Erix.


Da quello che so, Inform assomiglia moltissimo (copioni!) al C. Il parser è
stato scritto in Inform e quindi è come programmare in C con una libreria
per il parsing già pronta.
Kiuhnm


int strcmp(char *str1, char *str2)
{
    while (*str1 && *str2)
    {
        if (*str1 > *str2) return 1;
        elseif (*str1 < *str2) return -1;
        str1++;
        str2++;
    }
    if (*str1) return 1;
    else if (*str2) return -1;
    else return 0;
}
Dovrebbe andare bene....
Ritorna 1 se str1 > str2, -1 se str1 < str2 e 0 se sono uguali (confronto
lessicografico, dove "aaaa" > "aaa")
Kiuhnm


Sul sito di Inform 
http://www.inform-fiction.org
 sezione support
dovrebbe esserci una libreria (istring.h) che gestisce tutte le funzioni
di manipolazione stringhe.
Ecco la lista (chi conosce il C ne conosce il significato):
! --C-BASED FUNCTIONS--
!  WriteString:
!  PrintString: !
! StrCpy:
! StrCat:
! LStrCat:
! StrCmp:
! LStrCmp:
! StrLen:
! LStrLen:
! StrChr:
! StrStr:
! --NON-C-BASED FUNCTIONS--
!
! EmptyString: !
! Justify:
bai
tommaso

 ! LStrCmp:
Queste suonano bene.
   .Erix.

 > IF X=="BIANCO" then print "Giallo";
Oltre a istring.h suggerita da tommaso, su if-archive (
www.ifarchive.org
)
trovi alcune altre librerie specifiche per il trattamento delle stringhe
(dai un'occhiata soprattutto a stringmaker.h di Roger Firth, dovrebbe fare
al caso tuo).
HAPPY INFORMING
Giovanni
PS: ancora un po' di pazienza per Infit 2!!!

lessicografico, dove "aaaa" > "aaa")
Dunque... mi sono documentato un po' e ho scritto un paio di funzioni.
Devo dire che Inform tratta gli array in un modo piuttosto curioso.
Ecco come si definisce un array in Inform:
Constant BUF_LEN 33; 
Array nome_player->BUF_LEN;
Per leggere dei caratteri da tastiera ho scritto la funzione
ReadArray:  
[ ReadArray buffer text;
  buffer->0=BUF_LEN-3;
  print (string) text;
  read buffer 0;
];
L'istruzione inform read trasferisce i caratteri nell'array a partire
dalla posizione 2. Nella posizione 0 deve essere specificato il numero
massimo di caratteri che è possibile inserire (BUF_LEN-3), mentre
nella posizione 1 la funzione trasferisce automaticamente il numero di
caratteri inseriti dall'utente (la lunghezza della stringa, insomma).
Quindi, se chiamo la la funzione in questo modo
ReadArray(nome_player, "Come ti chiami? "); 
e poi scrivo Carlo: 
in nome_player->0 avrò il valore 30, in nome_player->1 avrò 5 e poi a
seguire c a r l o. Il brutto della funzione READ è che non è
case-sensitive. 
 

lessicografico, dove "aaaa" > "aaa")
Ecco poi come ho scritto la funzione che compara due stringhe:
[ CmpStr temp1 temp2 i c;
  i=2; c=0;
  !se le stringhe non hanno la stessa lunghezza
  if (temp1->1 ~= temp2->1) return 0;
 
  .Compare;
  if (temp1->i == temp2->i) {i++; c++;} else return 0;
  if (c==temp2->1) return 1; else jump Compare;
];
In effetti si potrebbe migliorare un po'. Sono convinto che si può
usare un solo indice anziche' due e soprattutto che l'ultimo pezzo
(quello del jump Compare) si può riscrivere in maniera strutturata.
Ma il tempo è quello che è e i go to a volte fanno molto comodo... :-)
Comunque, se non saltano fuori nuovi errori, se chiamo la funzione
come:
n=CmpStr (nome_player, nome_computer);
restituisce in n il valore 0 se le due stringhe hanno lunghezza
diversa, 1 se ovviamente la loro lunghezza è la stessa.
Grazie lo stesso comunque per il tuo esempio.
Ciao da
Vincenzo

PS: ancora un po' di pazienza per Infit 2!!!
Speriamo che escano presto. :-)
Non vedo l'ora di dare una bella occhiata ai listati in italiano...
Grazie e ciao da
Vincenzo

 Devo dire che Inform tratta gli array in un modo piuttosto curioso.
Mamma mia! Non studierň mai l'Inform. L'importante comunque č che tu abbia
risolto.
Kiuhnm

risolto.
Per scrivere un'AT in Inform non devi fare di certo tutto questo
casino, perché la maggior parte delle funzioni sono gia' pronte (ci
mancherebbe altro).
Ad ogni modo ci sono un sacco di estensioni che fanno praticamente
tutto quello che vuoi (come la istring.h appunto che ti permette di
fare sulgli array tutte le operazioni che vuoi.). Quello che invece
non ho ancora visto è un'estensione che ti permetta di acquisire dei
numeri da tastiera, e sono riuscito ad ovviare a questo inconveniente
andando a prelevare le relative funzioni da uno dei numerosi
programmini di esempio disponibili su Internet. 
Certo che è pazzesco da parte di Nelson presentare un linguaggio bello
e completo come questo con un manuale così brutto e senza le funzioni
per fare delle cose ovvie e banali come gli input di testo e numeri da
tastiera. Mah, contento lui...
Meno male che c'è Firth.
Ciao da
Vincenzo

 risolto.
Non è diventato certo famoso per gli array Inform.
E' la comunità che ha reso così popolare Inform rispetto ad esempio
TADS e HUGO seppur molto diffusi.
Inoltre basta vedere il numero di librerie scritte per Inform, c'è da
meravigliarsi,
si trova praticamente di tutto.
bai
t

 e completo come questo con un manuale così brutto
Dopo averci sbattuto un po' la testa non dirai + che è brutto,
e la IBG ti sembrerà molto elementare!!!
bai
t

e la IBG ti sembrerà molto elementare!!!
Beh, per tagliar corto, sul DM4 il mio parere e' lo stesso di Enrico
Colombini: eccessivamente prolisso e dispersivo per un  programmatore,
troppo tecnico per un novizio e male organizzato per entrambi. 
E' anche vero che lo trovo difficile in alcune sue parti perche' sono
ancora un novizio, ma ciò non toglie che sia strutturato male...
Ciao da
Vincenzo

si trova praticamente di tutto.
E meno male. Il lavoro di Nelson è stato grandioso anche se come tutte
le cose non privo di difetti, ma la cosa altrettanto impressionante è
il numero di estensioni che ci sono in giro. Pazzesco. :))
Ciao da
Vincenzo