Newsgroup: it.comp.lang.pascal
Titolo: Readkey

Cari membri del newsgroup, ho un problema (più di uno, anzi) da porvi.
Mi pare di avere sentito che ogni singolo carattare è gestito di una
variabile STRING, può essere gestito come elemento di un vettore. Per quanto
ne ho capito, dunque, il terzo carattere della variabile (STRING,
ovviamente) "nome", può essere individuato come "nome[3]". E' esatto? Se sì,
perchè in pratica non funziona? E, se al contrario, non è possibile, come
faccio a trattare il singolo carattere di una variabile STRING?
Seconda domanda, ho provato a scrivere un programma, con intento puramente
sperimentale, per vedere come si può ricevere una variabile STRING per mezzo
della funzione READKEY. Questo perchè potrebbe verificarsi la necessità di
dover limitare a un determinato numero di caratteri la variabile inserita da
tastiera, e quando essa supera quel limite, il programma prosegue
automaticamente; il vantaggio è che non si permette all'utente di scrivere
una stringa più lunga di un certo numero di caratteri, e che non si aspetta
la pressione del tasto INVIO. Ora arriva la domanda, come posso fare una
cosa del genere? Il mio intento è:
es. 'Nome: '
     l'utente scrive il nome
     quando il nome supera i 6 caratteri il programma prosegue
     'Confermi il nome? (S/N)?'
     ricevi e controlla "risp"
     'Ciao ',nome,', buona giornata!'
     aspetta la pressione di un tasto...
     fine.
Come potete vedere, il programma non ha un intento ben preciso poiché lo
scopo è solo quello di sperimentare quanto esposto sopra.
Il codice che ho scritto per attuare (per tentare, almeno...) ciò che ho
detto è:
program provanome;
uses crt;
var nome:array[1..30] of string;
    i:byte;
    risp:char;
begin
  clrscr;
  repeat
    i:=0;
    write('Scrivi il tuo nome: ');
    repeat
      i:=i+1;
      nome[i]:=readkey;
      write(readkey);
    until i=6;
    repeat
      write('Confermi? (S/N)');
      risp:=readkey;
      risp:=upcase(risp);
    until (risp='S') or (risp='N');
  until (risp='S');
  clrscr;
  write('Ciao ');
  for i:=1 to 6 do
    begin
      write(nome[i])
    end;
  write(', buona giornata!');
  readkey
end.
Questo codice però non funziona. Se lo proverete, vi accorgerete che il
programma non riesce a prendere tutti i caratteri scritti da tastiera.
Qualcuno sa come fare? A proposito, sebbene sia certo che ci sia
un'alternativa, non ho saputo fare altro che usare un array, invece di una
STRING. Questo si ricollega alla mia prima domanda.
Grazie per la pazienza!
Ciao!
Filippo

Una stringa e' gia' un'array di caratteri, non devi dichiararla array [] of
string
altrimenti ti ritrovi un vettore di stringhe :-)
cioe' a : string[10] equivale (+/-) a a : array[0..9] of char;
[
anche se poi le stringhe sono gestite un po' diversamente:
nell'allocazione le stringhe pascal (a differenza di C e altri linguaggi)
hanno
come primo byte la lunghezza, e poi n bytes i caratteri...
... ma questa e' un'altra storia... se devi accedere direttamente alla
memoria
o scrivere su file.... non ci pensare ;-)
]
poi per il resto il tuo prog dovrebbe andare
ciao,
un Dreadnaut che se il mio nome e' piu' di 6 char ?

 Cari membri del newsgroup, ho un problema (più di uno, anzi) da porvi.
PROBLEMA RISOLTO.
Filippo