Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    15

    [C++] Come funziona const_cast ?

    Salve a tutti,

    ho scritto il seguente programmino per capire come funziona il const_cast:

    #include<iostream>
    using namespace std;

    int main() {
    const int i = 3;
    cout << "Ho i = " << i << " nella locazione di memoria " << &i << endl;
    int *ip = const_cast <int *> (&i);
    *ip = 4;
    cout << "Ho *ip = " << *ip << " nella locazione di memoria "<< ip << endl;
    cout << "Ho i = " << i << " nella locazione di memoria " << &i << endl;
    return 0;
    }
    non riesco pero' a spiegarmi l'output del programma:

    Ho i = 3 nella locazione di memoria 0xbf848cfc
    Ho *ip = 4 nella locazione di memoria 0xbf848cfc
    Ho i = 3 nella locazione di memoria 0xbf848cfc

    ----------------------------------------------
    Program exited successfully with errcode (0)
    la locazione di memoria e' la stessa ma mi stampa due valori diversi!!!

    Qualcuno mi puo' spiegare, please?

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    15
    Provando invece con le printf:

    #include<stdio.h>

    int main() {
    const int i = 3;
    printf("Ho %d nell locazione di memoria %d\n",i,&i);
    int *ip = const_cast <int *> (&i);
    *ip = 4;
    printf("Ho %d nell locazione di memoria %d\n",*ip,&ip);
    printf("Ho %d nell locazione di memoria %d\n",i,&i);
    }
    ho come risultato:

    Ho 3 nell locazione di memoria -1075404060
    Ho 4 nell locazione di memoria -1075404064
    Ho 3 nell locazione di memoria -1075404060
    il problema di prima era nel cout. Come faccio allora a fare questo cast ?

  3. #3
    La butto lì così eh perchè sto iniziando ora a studiare i puntatori.
    Però mi sembra per questo, penso : int *ip = const_cast <int *> (&i);
    Cioè, nn hai scritto che la locazione di memoria è uguale al riferimento i?

    Edit: *ip = 4; ????

    Penso e spero per te
    Sistemi di allarme, telecamere, autoradio, video proiettori e altri prodotti tecnologici: fedom.it

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    15
    Il problema e' che voglio fare in modo che la costante i, non lo sia piu' in modo da assegnargli un nuovo valore. Pero' cosa succede? Il compilatore nel primo caso, col cout, mi prende in giro e mi dice che ip e' la locazione della variabile i, invece non e' vero. Nel secondo caso si sputtana e mi fa vedere che scrive il 4 da un'altra parte. Ma io voglio cambiare il 3

  5. #5
    a quindi sto const_cast serve a rendere auto una variabile?
    Sistemi di allarme, telecamere, autoradio, video proiettori e altri prodotti tecnologici: fedom.it

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    15
    Da quello che sto leggendo in rete serve ad esempio se hai una funzione che prende come argomento un const, tipo:

    void g(const int& i);

    int main() {
    int i = 3;
    g(i);
    cout << i;
    }

    e con la g vuoi passare la i ad una funzione f:

    void g (const int& i) {
    f(&i);
    }

    il compilatore ti da errore perche' si preoccupa che la f possa cambiarti la variabile

    void f(int& i) {
    i = 4;
    }

    Se al posto di f(&i) invece usi:

    f(const_cast<int&>(i));

    si zittisce e te la modifica. Se nel main avevi dichiarato "i" come const comunque, nel campo di visibilita' del main la i rimane a 3.

    Pero' mi rimane allora il dubbio: come faccio a svolgere questo esercizio da thinking in c++?

    Create a const array of double and a volatile array of double. Index through each array and use const_cast to cast each element to non-const and non-volatile, respectively, and assign a value to each element.

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Const cast serve ad eludere l'attributo const del suo operando tutto qui.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    15
    Grazie degli interventi, ora le idee mi sono un po piu' chiare, ma non ho ancora idea di come risolvere l'esercizio di TICpp che ho quotato. Qualcuno per favore mi puo' dare qualche dritta? DaiDaiDaiDai?

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Non è molto difficile

    Create a const array of double and a volatile array of double. Index through each array and use const_cast to cast each element to non-const and non-volatile, respectively, and assign a value to each element.

    Svolgiamolo velocemente

    codice:
    //Creare un array di double const e uno volatile.
    
    const double ConstDouble[100];
    volatile double VolatileDouble[100];
    
    //Utilizzare const_cast per assegnare ogni elemento.
    
    for (int i = 0; i < 100; i++)
    {
        const_cast<double>(ConstDouble[i]) = static_cast<double>(1);
        const_cast<double>(VolatileDouble[i]) = static_cast<double>(1);
    }
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    15
    Grazie per l'interesse , pero' non va bene:

    cast.cc:8: error: uninitialized const ‘ConstDouble’
    cast.cc:15: error: invalid use of const_cast with type ‘double’, which is not a pointer, reference, nor a pointer-to-data-member type
    cast.cc:16: error: invalid use of const_cast with type ‘double’, which is not a pointer, reference, nor a pointer-to-data-member type

    Se faccio un array costante devo inizializzarlo subito:

    const double ConstDouble[3] = { 1, 2, 3 };

    per il volatile non ce n'e' bisogno ovviamente ed e' ok.

    Poi il const_cast funziona solo coi puntatori, tipo static_cast<double*>

    e' per questo che insorgono tutti questi problemi

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.