Newsgroup: it.comp.lang.c
Titolo: Cosa sono dichiarazioni come queste?

Salve, e' da un po' che traffico con il C e il C++
e in un sorgente ho trovato queste dichiarazioni:
dist(m,l,r,rp,dm,sumdm,iframedm)
int m, l, *iframedm;
float dm[], r[], rp[], sumdm[];
{
... ecc. ecc. ...
}
La procedura dist( ... ) compila perfettamente,
ma perche' le sue variabili sono dichiarate
FUORI dalle parentesi graffe??
C'e' differenza fra dichiarare le variabili di
una procedura dentro e fuori il corpo (le graffe)?
Quale?

 ha scritto nel messaggio
news:IrvZ5.54477$%j3.6...@news6.giganews.com...

Non vorrei sbagliarmi ma sembra lo stile "pre Ansi".


Sono dichiarazioni secondo lo stile K&R prima edizione, il cui uso è
attualmente deprecato anche se i compilatori le accettano per motivi
di compatibilità.
HTH

 HTH
Ah, capito... infatti il codice in questione e' di un po' di tempo fa.
Ma il fatto di usare una sintassi deprecata ha poi qualche effetto
sul codice generato o e' solo una questione di stile?
La deprecazione dipende dal fatto che le variabili dichiarate in
quel modo dovrebbero (in teoria) essere invisibili alla subroutine
perche' dichiarate al di fuori delle parentesi graffe del suo blocco
di istruzioni?

 di istruzioni?
Attenzione! Quelle non sono variabili, diciamo normali, sono la definizione
del tipo dei parametri passati alla funzione, cioe' quelli chiusi tra le
parentesi tonde (se noti hanno gli stessi nomi).
ciao
donCiccio


E vero... non ci avevo fatto caso :#)
Ma questo apre un secondo interrogativo...
Perche' dichiara cosi' i parametri invece di fare
dist (int m, int l, float dm[] ecc. ecc...)
E' solo una questione di stile? O c'e' altro dietro?


Il C e' nato con la dichiarazione dei parametri fatta in quel modo li' (K&R
circa 198x)  poi lo standard e' stato trasformato nel modo che tu conosci.
Probabilmente e' un pezzo di codice d'antiquariato... :-)
ciao
donCiccio


:°(
Io uso ancora dichiarazioni come queste, poichè il codice che
genero deve girare anche su Interactive (il vecchio Unix della Sun).
Ciao.

 di istruzioni?
No. I parametri sono sempre visibili alla funzione, ( altrimenti non
potrebbe funzionare).
Il K&R non obbliga all'uso dei prototipi di funzione, nè alla indicazione
del valore di ritorno (in mancanza si assume sempre int); inoltre mancano
le keywords introdotte successivamente (void, const etc). Il compilatore
ha quindi meno possibilità di verificare la correttezza del codice sorgente,
cosa che il programmatore deve compensare con una maggiore attenzione.
Se usi un compilatore DOS-16bit puoi tranquillamente compilare un programma
scritto tutto in K&R, mentre e` da evitare l'alternanza dei due stili (K&R e
ANSI/ISO) nella stessa unità di compilazione.
Con i compilatori Windows-32bit un problema maggiore nasce dalla differenza
di dimensione degli interi (rispettivamente 2 e 4 bytes), specialmente quando
il programma, ricompilato a 32bit, deve leggere ed aggiornare files scritti
da quello a 16bit. 
Per mantenere l'allineamento dei dati, prima di ricompilare, si dovrebbero
trasformare  gli int in short per tutte le variabili ed i parametri funzione
definiti dall'utente.
HTH gfb

 E' solo una questione di stile? O c'e' altro dietro?
Probabilmente all'inizio non esisteva il conecetto di dichiarazione di tipo 
di variabili ( per inizio intendo "il padre del C : bcpl" ? ); poi e' stato 
aggiunto in una forma che fosse di transizione con il vecchio sistema ( si 
passavano solo interi senza tipo ) vedi quest'esempio:
vecchio modo 
void  f( a,b )
struct nome_della_struttura     *a, *b;
{
....
nuovo modo
void  f( struct nome_della_struttura    *a,struct nome_della_struttura *b; )
{
Cosi la definizione di una funzione,  e' molto simile alla sua 
dichiarazione ( il prototipo ): la differenza e' solo il punto e virgola;


Oppsss!  Non volevo offendere nessuno.
scusami
ciao
donCiccio