PDA

Visualizza versione completa : Stroustrup 3a ed. aiuto sul Cap.6 Calcolatrice da tavolo


gidierre
07-08-2002, 04.13.03
Pag. 124, Cap. 6.1.1, ripreso in 8.2
Calcolatrice da tavolo - L'analizzatore sintattico

Stroustrup scrive : expr() chiama term() che chiama prim() che chiama
expr() e questo loop va ovviamente interrotto.
Mettendo una dichiarazione anticipata di
double expr(bool);
prima di prim()
vale a dire così :

double expr(bool);
double prim(bool get) {definizione};
double term(bool get) {definizione};
double expr(bool get) {definizione};

il problema è risolto!
Cfr. il codice dal Cap. 6.1.3 che si può trovare qui:
http://www.research.att.com/~bs/dc.c

Ma perché ? L'ho letto e riletto e non riesco a capire che differenza
faccia mettere una dichiarazione anticipata di expr() lì :(
Inizialmente avevo capito che servisse a rendere expr() visibile a
prim(), ma non è così semplice perché il libro precisa che questo è
fatto anche per interrompere il circolo vizioso.

Qualcuno che l'ha letto e capito meglio di me potrebbe aiutarmi a
capire ?
Grazie.

newuser
08-08-2002, 18.26.21
Non conosco assolutamente il C, però mi sembra un refuso della traduzione.

Definire expr(bool) vuole dire creare l'entry point della funzione tra i simboli del programma (P8257 Web Master, aiutaci!). Infatti non dovrebbe essere possibile compilare il programma senza creare l'entry point di expr, perchè viene utilizzato da prim. Dato che il codice di expr viene eseguito solo a run-time, la definizione (o caricamento in memoria) può essere fatta successivamente. Il "loop" indicato dal testo è semplicemente il fatto che expr chiama term e term chiama prim ma anche prim chiama expr, non come ciclo ma come successione di chiamate

gidierre
11-08-2002, 01.08.04
Originariamente inviato da newuser
Il "loop" indicato dal testo è semplicemente il fatto che expr chiama term e term chiama prim ma anche prim chiama expr, non come ciclo ma come successione di chiamate

Beh, newuser, non conoscerai il C, ma direi che hai azzeccato in pieno.
Infatti, questa è secondo me l'unica spiegazione (intendo anche sulla base dei messaggi ricevuti sull'argomento sul ng dedicato al C++).
Non è un errore di traduzione e\o stampa, perché di loop si parla nell'originale.
Anche a me sembra un po' ambiguo chiamarlo loop senza sottolineare che riguarda solo le dichiarazioni e non l'esecuzione, ma insomma...

Ciao e grazie :)