Newsgroup: it.comp.lang.c++
Titolo: problema di const

Salve a tutti , ho un problema a compilare un sorgente che mi sta facendo impazzire. Allora
 
ho il seguente codice (mi permette di verificare se è presente o meno un elemento in una linked list): 
 
9. bool inlist(const Record* &L, const int &e)	 
10. {
11.
12.       Record* temp=L;  
13.      while (temp != 0 )
14.       {
15.               if(temp->elem == e) /* se ho trovato l'elemento */
16.                             return true; /* ritorno il valore true */
17.               else
18.               temp = temp->next; /*altrimenti passo al nodo successivo*/
19.               
20.       } 
21.             
22.     
23.       return false;  /* se non ho trovato niente restituisco false */
24.       
25. }
 
 
Su questo codice ricevo l'errore (compilato con il devc++):
linea 12.:  invalid conversion from `const Record*' to `Record*' 
 
se faccio la dichiarazione di temp in questo modo:
12_new.      const Record* temp=L; 
 
ovviamente non ricevo piu' l'errore, ma in tal caso non sto dichiarando un puntatore temp 'immodificabile' ?... sono un po' confuso ...
 
 
inoltre ho notato che se utilizzo un typedef:   typedef Record* miotipo;
 
e faccio in questo modo
 
9_new. bool inlist(const miotipo &L, const int &e)	 
 
e faccio l'assegnazione in tal modo
 
12_new.     miotipo temp=L;
 
 
non ricevo alcun errore !!! Ho testato piu' volte ed è cosi'!! non è strano ??
 
---------------------------------
 
avrei altre domandi da porvi ma mi fermo qui :D
 
Per piacere delucidatemi che altrimenti non ne esco . ho un esame a breve tnx ! :)
 
 
 

 sono un po' confuso ...
 
No, non � il puntatore ad essere costante ma l'oggetto puntato. Il puntatore 
costante si dichiarerebbe cos�:
 
Record* const temp=L;
 
EMG
 
--
EMAG Software Homepage:     
http://www.emagsoftware.it
 
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
 
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
 
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 
 
 

ok, allora in questo caso sto dicendo che l' oggetto Record è costante, ma che significa che una struttura è costante ?? che non posso modificare i suoi membri ?!?
 
e per il resto ???
 
intanto ... grazie ;)

 è costante ?? che non posso modificare i suoi membri ?!?
 
Esatto. Comunque non penso che tu possa imparare il C++ in questo modo. Ti 
mancano i fondamenti.


Derivo da altri linguaggi di programmazione e sto imparando. Ognuno impara a suo modo.. Resta il fatto che non si spiegano alcune cose del sorgente che ho postato...

 Derivo da altri linguaggi di programmazione e sto imparando. Ognuno impara a suo modo.. Resta il fatto che non si spiegano alcune cose del sorgente che ho postato...
 
Non ti preoccupare, sul const anche i "professionisti" a volte si confondono :)
Ho visto spesso togliere decine di const perché un codice non compilava :D
 
In ogni caso il concetto di base è abbastanza semplice..
Ogni "qualcosa" (oggetto, riferimento, variabile, funzione, etc.) lo puoi
dichiarare costante, il che vuol dire, a livello intuitivo, che non può essere
modificato.
Ovviamente, quando dichiari qualcosa costante deve rimanere tale ovunque esso
vada, quindi quando dici, ad un certo punto, che qualcosa è "const", "da lì in
poi" ci deve rimanere.
 
Questo ragionamento fa un po' acqua quando si comincia a parlare di:
- puntatori: è il puntatore che è costante o è l'oggetto a cui punta che è 
costante?
- funzione: una funzione non la posso modificare in ogni caso, per cui cosa
significa dichiarare una funzione const?
Nel primo caso abbiamo due casi e due sintassi diverse, nel secondo è un modo
diverso di dire qualcos'altro.
 
Se incominci a maneggiare quanto detto sopra vedrai che i const sono pure,
oltre che facili, decisamente utili!
 
Ciao!


 
Infatti; solo da relativamente poco tempo ne apprezzo
l'immensa comodità, sia a livello visivo (mi ricorda
immediatamente cosa "succede" nel codice) che di
protezione da cavolate.
 


 
 
-- 
1) Resistere, resistere, resistere.
2) Se tutti pagano le tasse, le tasse le pagano tutti
Soviet_Mario - (aka Gatto_Vizzato)
 

Grazie a tutti per le info ;)

> breve tnx ! :)
 
Comprati un buon libro (livello medio-avanzato) tipo :
 
Corso di programmazione C++
Stanley B. Lippman
Josée Lajoie
 
Io ho la terza edizione .
Lo definirei comprensibile ,esaustivo,completo.
 
Ad esempio l'argomento sui riferimenti , const, puntatori costanti a 
oggetti costanti,puntatori costanti a oggetti NON costanti .
 
E ancora la dettagliata spiegazione delle regole che determinano l'uso 
dei ref &.
edi come il compilatore li implementa.
 
Per farti un esempio -tratto dal libro (sui riferimenti const):
 
Quando scriviamo:
 
double dval = 1024 ;
const int &ri = dval ;
 
Il compilatore lo trasforma tipo :
 
int temp = dval ;
const int  &ri = temp ;
 
Assegnando un nuovo valore a ri , non cambia il valore di dval (1024) ma 
quello di temp. Dal punto  di vista dell' utente l'assegnamento non 
funzionerebbe.
I riferimenti const sono A SOLA LETTURA .
 
Le prime volte è difficile fare dichiarazioni corrette:
 
Si vuole inizializzare un riferimento con l' indirizzo di un oggetto 
const (ival) ,inteso come normale puntatore (ival) :
 
const int ival = 2048;
//errore richiede un riferimento costante;
int *&pi_ref  = &ival ;
 
Allora nel correggere facciamo:
const int ival = 2048;
//altro errore !!!
const int *&pi_ref  = &ival ;
 
perché ?
 
Leggendo la definizione di pi_ref (Sempre da destra verso sinistra)
vediamo che è un riferimento a un puntatore a un oggetto di tipo int 
definito const!!!
Quindi in riferimento &ival (costante) non è assegnato ad una costante 
ma ad un
puntatore NON costante che punta ad un oggetto costante (const int) .
Dovrebbe essere un puntatore COSTANTE che punta ad un oggetto costante 
(const int) .Quindi:
 
const int ival = 2048;
//GIUSTA !!!
const int *const &pi_ref  = &ival ;
 
La differenza sostanziale tra riferimento e puntatore è che un riferimento
deve sempre riferirsi ad un oggetto Es: definizione con assegnamento.E che
l'assegnamento di un riferimento ad un altro cambia il VALORE dell'oggetto
a cui si riferisce e non il riferimento stesso.
 
Bye...