Newsgroup: it.comp.lang.pascal
Titolo: alcune domande

ciao a tutti,
Domani dovro' pomeriggio avro' un esame pratico di Pascal e a tuttora ho
alcuni dubbi. 
1) Esiste a tutti gli effetti uno standard pascal (ISO?, ANSI?...)?
2) L'uso della assign(var_text, <nome_file>)  e' standard?
3) Un packed array di char non puo' (sempre nello standard) essere letto
con una readln(nome_array);
4) Il concetto di null alla fine di una stringa (packed array) non
esiste in pascal, nel senso che se il mio
array e' "pippo: PACKED ARRAY [1..10] OF char;" io ci posso scrivere max
9 o 10 caratteri?
5) Il mio compilatore (Free Pascal Compiler v. 0.99.12 per Linux)
compila correttamente questa porzione di codice:
PROGRAM assurdo (input, output);
TYPE
  all_week =  (lun, mar, mer, gio, ven, sab, dom);
  work = lun..ven;
VAR
  wrk_day: work;
BEGIN
    wrk_day := dom;
    IF wrk_day IN [lun..ven] then
        writeln ('in lun..ver, ord = ', ord(wrk_day):1);
    IF wrk_day IN [sab, dom] then
        writeln ('in week-end, ord = ', ord(wrk_day):1);
END.
Questo e' l'output:
% in week-end, ord = 6
?????????????????????????????????????????????????
E' il compilatore che e' stupido o io???
 
Grazi in anticipo 
giucas

E' il compilatore che e' stupido o io???
Non vedo che cosa ci sia di sbagliato, se wrk_day vale dom vuol dire
che ord(wrk_day) e' 6
Andrea Laforgia        (
andrea_...@bigfoot.com
)
----------------------------------------------------
There is nothing better for understanding a kangaroo
than seeing it jump.
----------------------------------------------------

 che ord(wrk_day) e' 6
La cosa strana e' che io ho definito wrk_day come un subrange che va da
'lun' a 'ven'. Non mi dovrebbe permettere di assegnargli 'dom' come
valore!
grazie e ciao
giucas

valore!
No, affatto.
I tipi enumerativi servono a dichiarare costanti numeriche in modo
alternativo. Il fatto di aver dichiarato work come lun..ven sta a
significare che esso e' una variabile numerica e che, in quanto tale,
puo' assumere anche il valore dom, che e' una costante numerica.
L'indicazione dell'intervallo di appartenenza e' solo indicativo per
il programmatore, ma non implica alcun vincolo all'assegnazione.
Andrea Laforgia        (
andrea_...@bigfoot.com
)
----------------------------------------------------
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Il mio indirizzo di posta elettronica e' momentanea-
mente fuori uso...


 
Allora vi sconsiglio il libro:
"Introduzione al Pascal" W. Findlay, D.A.Watt
Pag. 75 2ndo capoverso:
"[...] NRDAYSINMONTH: 28..31 [...] se inavvertitamente gli viena
assegnato un valore estraneo alla serie come 28 o -9999 esso viene
immediatamente isolato ed il calcolatore emette il corrispondente
messaggio di errore."
grazie eciao
giucas

messaggio di errore."
Il problema e' che un comportamento di questo tipo si dice
"implementation-dependant" in quanto non c'e' un reale vincolo
all'assegnazione. Ogni compilatore, cioe', lo implementa in modo
differente. Il Turbo Pascal, se non erro, emette un segnale di
costante fuori indice, ma non e' detto che un altro compilatore (vedi
quello che hai utilizzato tu) non lo compili con successo.
Difatti, Il fatto di dichiarare una variabile come compresa in un
determinato intervallo costringe il compilatore a riservare,
presumibilmente, uno spazio di memoria piu' capiente dell'intervallo
stesso.
Mi spiego : il fatto di dichiarare NRDAYSINMONTH : 28..31, fa si' che
per questa variabile venga riservato un byte di memoria (se e' di 8
bit puo' assumere 256 valori). Certo, il compilatore preciso segnala
la fuoriuscita dal limite, ma assegnare il valore 50 non conduce ad un
errore fatale, a meno di non utilizzare la variabile come indice di un
vettore. In quanto al testo, e' comunque sbagliato, in quanto 28 e'
compreso nell'intervallo ed e' quindi un valore accettabile.
