Newsgroup: it.comp.lang.c++
Titolo: passaggio paramtri tra funzioni

Salve.
Sapete dirmi perchč il compilatore mi da questo errore? O meglio, sapete
come si passa una matrice ad una funzione?
Tnx TaTo
--------------------------------------
int matrice[6][6];
int inizializza(int *matrice);
main(){
    inizializza(int *matrice);
}
int inizializza(int *matrice){
    codice classico per inizializzare
    return *matrice;
}
-----------------------------------------
error C2664: 'inizializza' : cannot convert parameter 1 from 'int [6][6]' to
'int *'

int inizializza(int *(*mat)[6] ) ;

come si passa una matrice ad una funzione?
leggi le faq su 
www.programmazione.it
 ci sono molte valide
risposte in merito.
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

 int inizializza(int *matrice);
La tua matrice non č un int * ma un int *[6] e come tale dovresti
trattarlo:
int inizializza(int (*matrice)[6]);
oppure (equivalente e forse piů chiaro):
int inizializza(int matrice[6][6]);
EMG

 int inizializza(int *(*mat)[6] ) ;
Hai messo un asterisco di troppo:
int inizializza(int (*mat)[6] ) ;
EMG

you wrote:

Non credo, sto passando l'indirizzo della matrice, passaggio per
riferimento, che a te non piace ;).
*(*mat)[6] 
significa 
puntatore ad una matrice di 6 puntatori.

int inizializza(int matrice[6][6]);
int (*matrice)[6] 
non equivale a
int matrice[6][6]

puntatore ad una matrice di 6 puntatori.
ma
int matrice[6][6];
non e` un array di puntatori a interi (int* matrice[])...
in generale T mat[4][5] decade a T (*mat)[5]
Provare per credere!


 puntatore ad una matrice di 6 puntatori.
Mi fai un esempio di come utilizzare una funzione che accetta un tipo
del genere? Con la mia
int inizializza(int (*mat)[6] );
basta scrivere
int matrice[ 10 ][ 6 ];
inizializza( matrice );
e con la tua? Io non ci riesco.
EMG

 int matrice[6][6]
Nei parametri formali di una funzione i due tipi sono equivalenti in
quanto la prima dimensione non viene utilizzata. E' esattamente come
quando scrivi
void funzione( int array[ 10 ] );
che equivale a
void funzione( int *array );
EMG

del genere? Con la mia
(*mat)[3][3]
E' la stessa cosa.

 E' la stessa cosa.
Neanche per sogno! Il mio compilatore mi dą errore se tento di passare
int matrice[ 10 ][ 6 ];
dove viene richiesta una
void funzione ( int *( *matrice )[ 6 ] );
mentre invece funziona perfettamente se la funzione č dichiarata come
void funzione (int ( *matrice )[ 6 ] );
EMG

void funzione (int ( *matrice )[ 6 ] );
Dipende da *come* passi la matrice :
void funzione( int *(*matrice)[6] )
{
}
main()
{
   int* p[6] ;
   funzione( &p ) ;
}

 }
Non è la stessa cosa. Si parlava di matrici bidimensionali di interi
mentre tu ora hai introdotto un array di puntatori ad intero. Sono due
tipi molto diversi. E comunque anche in questo caso si può utilizzare la
più semplice
void funzione( int *matrice[ 6 ] );
che tra l'altro fa si che venga rispettata l'aritmetica corretta:
incrementando matrice mi trovo al successivo puntatore ad intero. Mentre
con
void funzione ( int *( *matrice )[ 6 ] );
incrementando matrice ottengo il primo indirizzo al di fuori dell'array.
Penso proprio che sia un errore.
EMG

 Tnx TaTo
Salve!!
Sono quasi lusingato. Io, semplice novellino, sono riuscito ad innescare una
discussione tanto animata. WOW!!!!
Cmq.
La mia soluzione funzionante č:
/ /dichiarazioni
int matrice[col][row];
/ /prototipo
int inizializza (int matrice[row]);
main(){
    inizializza(matrice);
}
/ /implementazione
int inizializza (int matrice[row]){
    body
}
Ciao

 }
Dubito molto che questa "soluzione" possa funzionare. Tu hai una matrice
bidimensionale ed invece ne stai passando alla funzione una
monodimensionale, chiaramente incompatibile con la prima. Il compilatore
ti _deve_ dare errore.
EMG

 > La mia soluzione funzionante č:

Sorry ^__^
int matrice [][row]
bye

 int matrice [][row]
Così è giusto. Infatti dichiarare
void funzione( int matrice [][row] );
è esattamente identico a
void funzione( int ( *matrice )[row] );
EMG