Dubbio errore di conversione

di il
14 risposte

Dubbio errore di conversione

Salve a tutti.
nel passare per indirizzo un array bidimensionale ad una funzione

scrivo così


int *func (int **a){


//do stuff

}
e successivamente scrivo nel main


int main(){
int v[n][m]={numeri,-----}

int *array=func(v);


}
mi da un errore di compilazione del tipo (errore di compilazione lo scritto in modo generico):

cannot convert  int (*)[]’ to  int**’

14 Risposte

  • Re: Dubbio errore di conversione

    Ma int v[n] non è bidimensionale
  • Re: Dubbio errore di conversione

    Che compilatore usi? Dovrebbe essere meno vago…
    Comunque a me sembra monodimensionale l’array. L’errore però è bidimensionale…

    La funzione deve avere un parametro del tipo int [][COLONNE] dove COLONNE è una costante a compilazione
  • Re: Dubbio errore di conversione

    oregon ha scritto:


    Ma int v[n] non è bidimensionale
    Chiedo scusa ho sbagliato a scrive, ho modificato, ma da comunque lo stesso errore
  • Re: Dubbio errore di conversione

    _Achille ha scritto:


    Che compilatore usi? Dovrebbe essere meno vago…
    Comunque a me sembra monodimensionale l’array. L’errore però è bidimensionale…

    Manca un cast. Un array è implicitamente convertibile in puntatore ma non puntatore a puntatore. Se nella funzione hai l’interesse di utilizzare due volte l’operatore [] allora nella chiamata devi convertirlo a int **

    intendi scrivere un cosa tipo:
    
    int *array=**func(v);
    
    ad ogni modo lo fatto da sempre errore, non capisco.
  • Re: Dubbio errore di conversione

    68yslexic77ind ha scritto:


    _Achille ha scritto:


    Che compilatore usi? Dovrebbe essere meno vago…
    Comunque a me sembra monodimensionale l’array. L’errore però è bidimensionale…

    Manca un cast. Un array è implicitamente convertibile in puntatore ma non puntatore a puntatore. Se nella funzione hai l’interesse di utilizzare due volte l’operatore [] allora nella chiamata devi convertirlo
    intendi scrivere un cosa tipo:
    
    int *array=**func(v);
    
    ad ogni modo lo fatto da sempre errore, non capisco.
    Non proprio.

    Rileggi il messaggio.
  • Re: Dubbio errore di conversione

    _Achille ha scritto:


    Che compilatore usi? Dovrebbe essere meno vago…
    Comunque a me sembra monodimensionale l’array. L’errore però è bidimensionale…

    Manca un cast. Un array è implicitamente convertibile in puntatore ma non puntatore a puntatore. Se nella funzione hai l’interesse di utilizzare due volte l’operatore [] allora nella chiamata devi convertirlo a int **

    sono stato io a scriverlo per capire a cosa è dovuto il problema, il problema.
    Se vuoi qui c'è il programma dove mi è comparso l'errore (C++):
    
    
    
    #include <iostream>
    
    using namespace std;
    
    #define d 5
    #define c 5
    
    
    
    unsigned int  *func (unsigned int **k, int n, int m)
    {
       unsigned int *h= new unsigned int[d][c];
    
    for (int j=0; j<5; j++){
       for (int i=0; i<5; i++)
       {
            h[i][j]=k[i][j];
    
       }
    }
    return h;
    
    }
    
    
    int main ()
    {
    unsigned int a[5][5]={{4,3,2,1,2}, {3,2,4,2,1}, {43,73,2,6,4},{5,6,3,1,6},{6,43,1,4,6}};
    unsigned int *array= **func(a);
    
    for (int j = 0; j <5; j++)
    {
    
    	for (int i = 0; i <5 ; i++)
    {
    		cout <<array[i][j]<< " ";
    }
    }
    
    
    
    
    
    
    
    }
    
  • Re: Dubbio errore di conversione

    Non c'è nulla di strano, la funzione si aspetta un puntatore doppio ad int, invece tu gli passi un puntatore ad un array di m int. Detto in altre parole, int** e int(*)[m] sono due tipi diversi.
  • Re: Dubbio errore di conversione

    Mi spiace ma non ho capito.
    se io scrivo **k non vuol dire che la funzione si aspetta un array bidimensionale? io non gli passo un puntatore ad un array di m interi ma un puntatore ad un array bidimensionale [n][m]. Quindi dovrebbe essere tutto nella norma o almeno per quel che so io
    Vedrò di rivedermi la teoria
  • Re: Dubbio errore di conversione

    Devi rivedere MOLTO la teoria. Qui il codice corretto, dagli un'occhiata confrontandolo con la parte teorica ...
    
    #define ROWS 5
    #define COLS 5
    
    
    unsigned int **func(unsigned int k[][COLS], int rr, int cc)
    {
    	unsigned int **h = new unsigned int *[rr];
    
    	for (int row = 0; row<rr; row++)
    	{
    		h[row] = new unsigned int[cc];
    
    		for (int col = 0; col<cc; col++)
    		{
    			h[row][col] = k[row][col];
    		}
    	}
    
    	return h;
    }
    
    
    int main()
    {
    	unsigned int a[ROWS][COLS] = { 
    					{ 4,3,2,1,2},
    					{ 3,2,4,2,1},
    					{ 43,73,2,6,4},
    					{ 5,6,3,1,6},
    					{ 6,43,1,4,6} 
    				 };
    		
    	unsigned int **array = func(a, ROWS, COLS);
    
    	for (int row=0; row<ROWS; row++)
    	{
    		for (int col=0; col<COLS; col++)
    		{
    			cout << array[row][col] << " ";
    		}
    		cout << endl;
    	}
    
    	for (int row = 0; row < ROWS; row++)
    		delete[] array[row];
    
    	delete[] array;
    
    	return 0;
    }
  • Re: Dubbio errore di conversione

    Nippolo ha scritto:


    Non c'è nulla di strano, la funzione si aspetta un puntatore doppio ad int, invece tu gli passi un puntatore ad un array di m int. Detto in altre parole, int** e int(*)[m] sono due tipi diversi.
    Scusa sapresti dirmi dov'è che passo un puntatore?
    io passo solo "a" a func la quale è bidimensionale.
  • Re: Dubbio errore di conversione

    Int** e int(*)[m] sono due tipi diversi

    Hai letto bene questa?

    a è di tipo int(*)[m] che è DIVERSO da int**

    La teoria ...
  • Re: Dubbio errore di conversione

    oregon ha scritto:


    Devi rivedere MOLTO la teoria. Qui il codice corretto, dagli un'occhiata confrontandolo con la parte teorica ...
    
    #define ROWS 5
    #define COLS 5
    
    
    unsigned int **func(unsigned int k[][COLS], int rr, int cc)
    {
    	unsigned int **h = new unsigned int *[rr];
    
    	for (int row = 0; row<rr; row++)
    	{
    		h[row] = new unsigned int[cc];
    
    		for (int col = 0; col<cc; col++)
    		{
    			h[row][col] = k[row][col];
    		}
    	}
    
    	return h;
    }
    
    
    int main()
    {
    	unsigned int a[ROWS][COLS] = { 
    					{ 4,3,2,1,2},
    					{ 3,2,4,2,1},
    					{ 43,73,2,6,4},
    					{ 5,6,3,1,6},
    					{ 6,43,1,4,6} 
    				 };
    		
    	unsigned int **array = func(a, ROWS, COLS);
    
    	for (int row=0; row<ROWS; row++)
    	{
    		for (int col=0; col<COLS; col++)
    		{
    			cout << array[row][col] << " ";
    		}
    		cout << endl;
    	}
    
    	for (int row = 0; row < ROWS; row++)
    		delete[] array[row];
    
    	delete[] array;
    
    	return 0;
    }
    grazie mille di nuovo
    Oggi abbiamo fatto un esercizio in classe dove abbiamo dovuto usare una funzione che prenderesse un array bidimensionale, il ragazzo che ha svolto l'esercizio a scritto esattamente questo:
    
    unsigned int *func(**k....altri parametri) 
    
    dove per **k il professore spiegò che era il metodo per far prendere alla funzione un array bidimesionale quindi array[n][m]

    non pensavo fosse obbligatorio il #define ero competamente fuori strada e nelle slide non ci sta scritto nulla in relatizione a questo tipo di dichiarazioni
  • Re: Dubbio errore di conversione

    Non so cosa tu (e il professore) voglia dire con quel **k ma non ha molto senso in questo contesto.

    Chi ha detto che il #define è obbligatorio? Ti fai dei film tutti tuoi ...

    Vorrei vedere queste slide per capire se hai interpretato male ...
  • Re: Dubbio errore di conversione

    Sì oltre al fatto che il define è una direttiva al preprocessore perciò viene sostituita prima della compilazione, quindi è praticamente mai necessaria…
Devi accedere o registrarti per scrivere nel forum
14 risposte