Reinterpret_cast

di il
8 risposte

Reinterpret_cast

Sto provando in tutti i modi a comprendere questo cast ma non ci siamo, chi mi può aiutare?
double mat[2][3] ={1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
cout << somma(reinterpret_cast<double*>(mat), 2,3);

double somma(double* a, int n, int m)
{
double s=0.0;
for (int i=0; i<n; i++)
    for (int j=0; j<m; j++)
        s+= *(a+i*m+j);
return s;
}

8 Risposte

  • Re: Reinterpret_cast

    Cosa non capisci?
  • Re: Reinterpret_cast

    In una chiamata a funzione mat decade in automatico in un pointer-to-array di tre elementi double, mentre tu lo forzi ad essere un puntatore a double.
    Questo perché la funzione somma non richiede double (*a)[3] ma double *a.
  • Re: Reinterpret_cast

    Provo a fare qualche considerazione sul passaggio delle matrici alle funzioni così potete seguirmi laddove commetto errori:

    questa matrice posso passarla alla funzione somma in diversi modi:
  • Re: Reinterpret_cast

    Le risposte a queste domande le trovi nel link che ti ho postato l'altro giorno e che ti invito nuovamente ad esaminare.
    Prenditi il tempo per comprendere bene la sezione 6
  • Re: Reinterpret_cast

    Ho provato tutto il giorno a leggere ma non è così semplice, ci sono altri riferimenti che ha da darmi che lo spiegano bene?
  • Re: Reinterpret_cast

    Da qualche parte nel sito vengono indicati i libri da dove queste info vengono prese. Forse puoi trovarci spiegazioni più semplici.
  • Re: Reinterpret_cast

    In parte ho approfondito lo studio ma ho ancora questo dubbio:

    dato un array di dimensioni a:

    int a[NUM_ROWS][NUM_COLS],(*p)[NUM_COLS],i; ...
    
    for (p = &a[0]; p < &a[NUM_ROWS]; p++)
    (*p)[i] = 0;
    non mi è chiaro perchè si mette l'operatore & davanti a a[0] visto che rappresenta già l'indirizzo della riga a[0], quindi stessa cosa per &a[NUM_ROWS].
  • Re: Reinterpret_cast

    Allora: a[0] è l'identificativo (il nome) di un array di NUM_COLS elementi, il quale quando è usato decade in automatico in un puntatore al primo elemento dell'array stesso, ovvero in un puntatore ad a[0][0], con poche eccezioni.
    Una di queste è con l'operatore sizeof, un'altra è con l'operatore &.
    In questa istruzione "&a[0]", a[0] non decade e continua a rappresentare l'intero array, tutto il blocco.

    p non è un puntatore ad interi ma un puntatore a un blocco di NUM_COLS interi. Il tuo blocco abbiamo detto che si chiama a[0]. Quindi tu devi passare l'indirizzo dell'intero blocco a questo puntatore.
    La chiave è questa: a[0] decaduto, ovvero l'indirizzo del primo elemento dell'array a[0], è esattamente uguale come VALORE ad &a[0], ovvero l'indirizzo dell'intero array, ma sono concettualmente due indirizzi "diversi". In un modo il valore è visto come indirizzo di un int, nell'altro è visto come indirizzo di un blocco di interi, ovvero come indrizzo di un array.
Devi accedere o registrarti per scrivere nel forum
8 risposte