Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 27
  1. #11
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Ho scritto al volo senza testare:
    codice:
    int a = 3;
    int b = 5;
    int r;
    
    int Somma_perValore(int u, int v)
    {
    	int sum;
    	sum = u + v;
    	return sum;
    }
    
    int Somma_perIndirizzo(int *pu, int *pv);
    {
    	int sum
    	sum = *pu + *pv
    	return sum;
    }
    
    int Somma_perRiferimento(int& u, int& v)
    {
    	int sum;
    	sum = u + v;
    	return sum;
    }
    
    
    // La chiamata:
    
    r = Somma_perValore(a, b);        // I valori a,b sono copiati nelle variabili interne u,v.
    r = Somma_perIndirizzo(&a, &b);   // Solo gli indirizzi di memoria di a,b sono copiati su pu,pv.
    r = Somma_perRiferimento(a, b);	  // Le variabili interne u,v fanno riferimento alla memoria di a,b.
    Come diceva MItaly, l'operatore '&' che significa "indirizzo di:" non è da confondere con il tipo "Reference" che è un tipo speciale di puntatore.

    L'utilizzo di const è consigliabile per la sicurezza del codice, sarebbe conveniente studiarsi qualche documento sulla pratica del "Const Corectness".

    Passare i valori per indirizzo o per riferimento ha anche un'altro vantaggio, quello di poter modificare il contenuto di un oggetto senza doverlo restituire come valore di ritorno della funzione. Ovviamente tale oggetto non va dichiarato come costante, ma si può dichiarare come costante un suo eventuale puntatore, che potrà puntare solo e soltanto a quello stesso oggetto.

  2. #12
    Originariamente inviato da Paulin
    Ho scritto al volo senza testare:
    codice:
    ...
    Come diceva MItaly, l'operatore '&' che significa "indirizzo di:" non è da confondere con il tipo "Reference" che è un tipo speciale di puntatore.
    Una cosa non mi è chiarissima.
    Somma_perIndirizzo(&a, &b) copia gli indirizzi di a,b nelle variabili locali alla funzione, mentre in Somma_perRiferimento(a, b) le variabili interne alla funzione fanno riferimento ad a,b... Nel primo caso vengono usati i puntatori a, mentre nel secondo i riferimenti a. Ma non è la stessa cosa?
    SELECT neuroni FROM cervello
    WHERE status = 'funzionante';

    La query ha restituito: 0 risultati.

  3. #13
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da Hirakeydos
    Una cosa non mi è chiarissima.
    Somma_perIndirizzo(&a, &b) copia gli indirizzi di a,b nelle variabili locali alla funzione, mentre in Somma_perRiferimento(a, b) le variabili interne alla funzione fanno riferimento ad a,b... Nel primo caso vengono usati i puntatori a, mentre nel secondo i riferimenti a. Ma non è la stessa cosa?
    Non è la stessa cosa, come vedi nel primo caso la funzione ha come argomento due puntatori, il che equivale a dire due indirizzi di memoria. Nel chiamare la funzione ovviamente dobbiamo passare due indirizzi, infatti facciamo precedere il nome delle variabili dall'operatore "Indirizzo di...".
    Nel secondo caso la funzione ha come argomento due variabili di tipo "Riferimento" che sono un nuovo tipo di puntatore, il simbolo "&" infatti non significa più "Indirizzo di...", se postfisso alla dichiarazione di tipo esso significa "Riferimento ad un valore del tipo specificato". Nel chiamare la funzione non occorre passare due indirizzi, come si fa con i puntatori, si applicano semplicemente i nomi delle variabili da passare per riferimento.

    Il tipo "Reference" è un tipo speciale di puntatore che è stato introdotto nel C++. Ora anche in qualche compilatore C (non ricordo se rientra nelle specifiche del C99).
    É buona pratica adoperare i riferimenti al posto dei puntatori, fin quando se ne può fare a meno. Il motivo è che i riferimenti sono generalmente più sicuri dei puntatori.
    Per maggiori approfondimenti io leggerei:

    http://www.dgp.toronto.edu/~patrick/...ntersVsRef.pdf

    http://www.parashift.com/c++-faq-lite/references.html

  4. #14
    Originariamente inviato da Paulin
    Non è la stessa cosa, come vedi nel primo caso la funzione ha come argomento due puntatori, il che equivale a dire due indirizzi di memoria. Nel chiamare la funzione ovviamente dobbiamo passare due indirizzi, infatti facciamo precedere il nome delle variabili dall'operatore "Indirizzo di...".
    Nel secondo caso la funzione ha come argomento due variabili di tipo "Riferimento" che sono un nuovo tipo di puntatore, il simbolo "&" infatti non significa più "Indirizzo di...", se postfisso alla dichiarazione di tipo esso significa "Riferimento ad un valore del tipo specificato". Nel chiamare la funzione non occorre passare due indirizzi, come si fa con i puntatori, si applicano semplicemente i nomi delle variabili da passare per riferimento.

    Il tipo "Reference" è un tipo speciale di puntatore che è stato introdotto nel C++. Ora anche in qualche compilatore C (non ricordo se rientra nelle specifiche del C99).
    É buona pratica adoperare i riferimenti al posto dei puntatori, fin quando se ne può fare a meno. Il motivo è che i riferimenti sono generalmente più sicuri dei puntatori.
    Per maggiori approfondimenti io leggerei:

    http://www.dgp.toronto.edu/~patrick/...ntersVsRef.pdf

    http://www.parashift.com/c++-faq-lite/references.html
    Credo di aver capito. In pratica, nel caso di Somma_perRiferimento(a, b), i due argomenti vengono dichiarati come "Riferimenti di tipo intero" (int& ) il che, a differenza dei normali puntatori, ci permette di non dover aggiungere il simbolo "Indirizzo di" (l'asterisco) ogni volta che passiamo una variabile alla funzione e di ottenere comunque lo stesso effetto (cioè di aver memorizzato l'indirizzo di memoria).
    Ho letto poi in uno dei due link che hai postato che un riferimento punterà sempre alla stessa area di memoria per tutta la durata della sua "vita", mentre un puntatore può puntare a più indirizzi.

    P.S. Scusate se ripeto a modo mio le cose che dite, ma facendo così impiego di meno ad imparare e nel caso sbagliassi mi correggete.
    SELECT neuroni FROM cervello
    WHERE status = 'funzionante';

    La query ha restituito: 0 risultati.

  5. #15
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da Hirakeydos il che, a differenza dei normali puntatori, ci permette di non dover aggiungere il simbolo "Indirizzo di" (l'asterisco) ...
    Sicuramente ti sei sbagliato a scrivere, comunque il simbolo dell'operatore "Indirizzo di" è l'ampersand '&'. L'espressione &a restituisce l'indirizzo di memoria in cui è contenuto il valore di a.


    Originariamente inviato da Hirakeydos ... ogni volta che passiamo una variabile alla funzione e di ottenere comunque lo stesso effetto (cioè di aver memorizzato l'indirizzo di memoria).
    Si.


    Originariamente inviato da Hirakeydos Ho letto poi in uno dei due link che hai postato che un riferimento punterà sempre alla stessa area di memoria per tutta la durata della sua "vita", mentre un puntatore può puntare a più indirizzi.
    Si, per questo il reference è ritenuto più sicuro, inoltre esso non può essere dichiarato e poi definito in seguito, la memoria viene assegnata al momento della sua dichiarazione. I reference tuttavia non sono esenti da complicazioni, se dovesse succedere ad esempio di assegnare un riferimento ad un'area di memoria allocata dinamicamente è possibile che questa venga rilasciata dopodiché il riferimento non sarà più valido; in tal caso anziché proteggere il codice potrebbe causare dei guai. Allo stesso modo occorre evitare di assegnare riferimenti ad una memoria locale poiché esso potrebbe persistere anche dopo che quella memoria non è più valida:

    codice:
    	int& GetLocalValue()
    	{
    	        int a;
    	        return a;
    	}
    Se GetLocalValue() dovesse essere liberata dallo stack, il riferimento non sarà più valido.

    Ad ogni modo anche un puntatore lo si può dichiarare come costante, se non è necessario che esso possa puntare a diverse aree di memoria:

    codice:
    int * const pa = &a;
    Esso punterà per tutta la sua vita a quell'indirizzo di memoria.

  6. #16
    Hai ragione, l'asterisco significa Puntatore a.
    Ti ringrazio e ringrazio tutti per le spiegazioni, siete molto meglio di alcuni professori che conosco

    Un'ultima cosa però, mi direste cose c'è di sbagliato in questo programma (lo stesso che ho postato sopra) perché sono sicuro che ci sia qualcosa che si possa fare meglio.
    http://pastebin.com/hbWLKG7R
    SELECT neuroni FROM cervello
    WHERE status = 'funzionante';

    La query ha restituito: 0 risultati.

  7. #17
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Guardare cosa c'é di sbaglato nel tuo programma richiede un minimo di tempo, cosa che purtroppo in questo momento non ho. Ti consiglio di eseguire un debug, per vedere cosa fa il tuo programma controllando nei vari punti lo stato delle variabili in gioco. Se anche così non risolvi e trovi un ostacolo ti consiglio di aprire un nuovo thread.

  8. #18
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Aggiungo che con la reference si può fare una cosa di questo tipo:

    codice:
    template<class T> class MyArray
    {
        ...
        T& get_element_at(int index);
        ...
    }
    
    int main()
    {
        MyArray<int> array(...);
    
        array.get_element_at(21) = 42;
    }
    Come vedi viene cercato l'elemento all'indirizzo 21, e ne viene ritornata una reference.
    A questo punto array.get_element_at(21) è come se fosse una variabile, ed infatti è un lvalue a cui puoi assegnare un valore (in questo caso 42).

    Ovviamente si può fare anche con i puntatori, ma mi sembra una sintassi molto chiara così.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  9. #19
    Originariamente inviato da Paulin
    Guardare cosa c'é di sbaglato nel tuo programma richiede un minimo di tempo, cosa che purtroppo in questo momento non ho. Ti consiglio di eseguire un debug, per vedere cosa fa il tuo programma controllando nei vari punti lo stato delle variabili in gioco. Se anche così non risolvi e trovi un ostacolo ti consiglio di aprire un nuovo thread.
    Hai ragione. Comunque il mio programma funziona (e viene compilato senza ne errori ne warning) la mia curiosità era se si poteva migliorare, non tanto per il programma in se, ma per imparare a programmare meglio.
    Originariamente inviato da Ippo343
    Aggiungo che con la reference si può fare una cosa di questo tipo:

    codice:
    template<class T> class MyArray
    {
        ...
        T& get_element_at(int index);
        ...
    }
    
    int main()
    {
        MyArray<int> array(...);
    
        array.get_element_at(21) = 42;
    }
    Come vedi viene cercato l'elemento all'indirizzo 21, e ne viene ritornata una reference.
    A questo punto array.get_element_at(21) è come se fosse una variabile, ed infatti è un lvalue a cui puoi assegnare un valore (in questo caso 42).

    Ovviamente si può fare anche con i puntatori, ma mi sembra una sintassi molto chiara così.
    La verità? E' arabo per me
    Non sono ancora così avanti, ma grazie comunque
    SELECT neuroni FROM cervello
    WHERE status = 'funzionante';

    La query ha restituito: 0 risultati.

  10. #20
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    286
    Originariamente inviato da Hirakeydos
    Hai ragione. Comunque il mio programma funziona (e viene compilato senza ne errori ne warning) la mia curiosità era se si poteva migliorare, non tanto per il programma in se, ma per imparare a programmare meglio.
    Scusa, con la fretta non avevo capito.
    Ho dato una occhiata al tuo programmino, e mi sembra ben scritto. Per quel che è il suo scopo non cambierei nulla.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.