c++ chi mi spiega qualcosa?

Patch, script, modifiche al codice sorgente etc.

Moderatori: ragno, tapino, alez, zulu, davidea

Rispondi
davidea
Messaggi: 1279
Iscritto il: 16 ago 2009, 13:32
Località: Palermo
Contatta:

c++ chi mi spiega qualcosa?

Messaggio da davidea »

sto studiando un po' di c++, e mi ritrovo ad affrontare il seguente passo:

Codice: Seleziona tutto

You can use the keyword const for pointers before the type, after the type, or in both places. For example, all of the following are legal declarations:

const int * pOne;
int * const pTwo;
const int * const pThree;

pOne is a pointer to a constant integer. The value that is pointed to can't be changed.
pTwo is a constant pointer to an integer. The integer can be changed, but pTwo can't point to anything else.
pThree is a constant pointer to a constant integer. The value that is pointed to can't be changed, and pThree can't be changed to point to anything else.
The trick to keeping this straight is to look to the right of the keyword const to find out what is being declared constant. If the type is to the right of the keyword, it is the value that is constant. If the variable is to the right of the keyword const, it is the pointer variable itself that is constant.
const int * p1;  // the int pointed to is constant
int * const p2;  // p2 is constant, it can't point to anything else
il che secondo me' significa che con

const int * pOne;


una volta che assegno il valore a *pOne, poi non posso piu' cambiarlo perche' e' dichiarato costante.
posso invece assegnare un nuovo valore a pOne in' un' altra area di memoria.

mentre con

int * const pTwo;

posso assegnare a *pTwo valori per tante volte quante voglio
non posso invece riassegnare a pTwo una nuova area di memoria


se fosse giusta quest' interpretazione, mi chiedo allora, col compilatore gcc 4.4.1 , che a vdr dobbiamo applicare la const patch e quindi (ho estratto un paio di righe da tale patch)

- char *macroTITLE = strstr(Timer->File(), TIMERMACRO_TITLE);
- char *macroEPISODE = strstr(Timer->File(), TIMERMACRO_EPISODE);
+ const char *macroTITLE = strstr(Timer->File(), TIMERMACRO_TITLE);
+ const char *macroEPISODE = strstr(Timer->File(), TIMERMACRO_EPISODE);

*macroTITLE e *macroEPISODE diventano dei valori costanti e non piu' cambiabili ???

o visto che il testo che sto' leggendo e' targato anno 1997, e' cambiato qualcosa nel frattempo?
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: c++ chi mi spiega qualcosa?

Messaggio da ragno »

@davidea: provo a risponderti...

pOne e' un normale puntatore, quindi puo' cambiare il valore (l'indirizzo), e' inizializzato a puntare ad una varialible dichiarata costante (non modificabile)
pTwo e' un puntatore costante...Per sua stessa natura non puoi piu' cambiarne il valore (indirizzo)....

L'uso di const nel c++ consente al compilatore di effettuare controlli piu' severi in fase di compilazione, per evitare che eventuali "difetti" di programmazione (soprattutto nella gestione degli indirizzi di memoria) possano generare degli errori a runtime, aumentando cosi la "stabilita" del codice.

Nel caso del tuo esempio, al compilatore e' indicato che i puntatori macroTITLE e macroEPISODE una volta inizializzati con il valore di ritorno della funzione strstr(...) devono essere protetti da eventuali modifiche per garantire che il contenuto rimanga proprio quello...

ciao
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
davidea
Messaggi: 1279
Iscritto il: 16 ago 2009, 13:32
Località: Palermo
Contatta:

Re: c++ chi mi spiega qualcosa?

Messaggio da davidea »

grazie ragno per il tuo intervento, ora la cosa inizia ad esser piu' chiara!

cio' comunque che non comprendo e' il perche' gcc 4.4.1 blocca il processo di compilazione......

se io non dichiaro costante la variabile , saran pure fatti miei...... come fa' a rendersi conto che DEVE esser costante?
puo' anche darsi che andando avanti con lo studio cio' mi diventi chiaro, o che riesca a comprendere quale meccanismo e' posto in essere nella scrittura del codice di vdr per cui gcc si rende conto dell' incongruenza......

altra cosa che sto apprendendo, e che mi lascia un po' spiazzato (forse sono un' accentratore e voglio sempre sapere come funzionino le cose?) , che in c++ fanno la parte da leone gli header, nel senso che per sapere come viene usata una funzione, basta aprire gli header, senza curarsi di come la funzione lavora internamente, quindi mi sembra di capire che se voglio leggere il sorgente di vdr, e non riesco a capire una funzione cosa fa', dovro' cercarla negli header, che dovrebbero ben documentarla, senza aprire il corrispondente file .c ove e' implementata!
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: c++ chi mi spiega qualcosa?

Messaggio da ragno »

davidea ha scritto:
cio' comunque che non comprendo e' il perche' gcc 4.4.1 blocca il processo di compilazione......
Probabilmente dipende dai controlli piu' stretti che effettua il gcc 4.4.1 rispetto alle versioni precedenti...non ho guardato ma magari quegli elementi che generano un'errore in fase di compilazione fanno parte di una classe di oggetti derivata da una classe base di vdr, dove sono dichiarati const i contenitori per le stringhe e per effetto dell'ereditarieta'...devono esserlo anche le classi derivate...

ciao
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Rispondi