Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ritornare un vettore bidimensionale in una funzione
Forum - C/C++ - Ritornare un vettore bidimensionale in una funzione

Avatar
oliverissimo (Normal User)
Newbie


Messaggi: 11
Iscritto: 14/05/2010

Segnala al moderatore
Postato alle 12:46
Venerdì, 09/07/2010
Ciao a tutti :rotfl:
allora, premetto che il programma che vi faccio vedere adesso l'ho fatto per fare esercizio,   quindi vorrei attenermi a seguire il mio schema per imparare qualcosa in piu' :)
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void zero (int Arr[][])            // (err) inizializza un vettore [][] mettendo zero a  
  5. {                                  // tutti gli spazi
  6.         for (int i=0;i<3;i++)
  7.         {
  8.                 for (int j=0;j<3;j++)  
  9.                 {
  10.                         Arr[i][j]=0;  // err
  11.                         }
  12.                 }
  13.         }
  14.  
  15. void cmat (int Arr[][])                   // stampa un vettore        err
  16. {      
  17.         for (int i=0;i<3;i++)
  18.         {
  19.                 cout<<endl;
  20.                 for (int j=0;j<3;j++)  
  21.                 {
  22.                         cout<<Arr[i][j]<<"\t";       // err
  23.                         }
  24.                 }
  25.         }
  26.  
  27. void matrice (int Arr[][])            // inserisco matrice    err
  28. {
  29.         for (int i=0; i<3; i++)
  30.         {
  31.                 for (int j=0; j<3; j++)
  32.                 {
  33.                 cout<<"Inserisci gli elementi della matrice ["<<i<<"] ["<<j<<"] = ";
  34.                 cin>>Arr[i][j];      //  err
  35.                         }
  36.                 }
  37.         }      
  38.        
  39. int prodotto (int Arr[][],int Brr[][])     // fa' il prodotto tra 2 matrici  err
  40. {
  41.         int Crr;
  42.        
  43.         for (int j=0; j<3; j++)
  44.         {
  45.                 for (int k=0; k<3; k++)
  46.                 {
  47.                         Crr[j][k]=0;  // inizializzo
  48.                        
  49.                         for (int i=0;i<3;i++ )
  50.                         {
  51.                                 Crr[j][k]=Crr[j][k]+( (Arr[j][i])*(Brr[i][k]) );
  52.                                 }
  53.                         }
  54.                 }      
  55.         return Crr [][];
  56.         }      
  57.  
  58. int main()
  59. {
  60.         int A[3][3];
  61.         int B[3][3];
  62.         int Crr[3][3];
  63.  
  64.         zero(Crr);
  65.        
  66.         cout<<"PRODOTTO TRA DUE MATRICI\n\nPrima matrice: \n"; 
  67.         matrice(A);
  68.         cout<<"Seconda matrice: \n";
  69.         matrice(B);
  70.        
  71.         Crr[3][3]=prodotto(A,B);
  72.        
  73.         cout<<"\n\nIl prodotto tra le due matrici e': ";
  74.         cmat(Crr);
  75.                
  76.         return 0;
  77.         }



Il programma naturalmente non funziona, perche' non so' come fare il return di un vettore (ho improvvisato :D ) in piu' mi da' errore di compilazione (metto "err" alle righe corrispondenti agli errori).
Come ho detto prima non voglio cambiare il mio schema, vorrei solo imparare bene come far ritornare un vettore bidimensionale in una funzione e sapere perche' mi da' l'errore di compilazione.
Grazie mille in anticipo 8-)

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 13:06
Venerdì, 09/07/2010

non puoi passare un vettore con entrambi gli indici undefined ad una funzione, devi passarlo come int *arr[] oppure come int **arr, visto che alla fine della fiera un array bidimensionale è assumibile come un doppio puntatore.

poi, non puoi ritornare un array come se fosse una variabile, devi mettere il vettore dove la funzione inserisce i prodotti tra i parametri della funzione stessa. Un modo sbagliato di farlo sarebbe quello di ritornare un puntatore ad un array allocato dinamicamente, ma ti esporresti a dei memory leak e ad una violazione del pattern funzionale del C/C++.

quindi ricapitoliamo:

prototipo:

void Somma(int **arr1, int **arr2, int *arr3);

dove man mano fai arr3[x] += arr1[x][y] * arr2[x][y];

prima di chiamare la funzione Somma devi dichiarare il vettore risultato, quindi chiamarla:

Somma(vettore1, vettore2, risultato);


PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 13:09
Venerdì, 09/07/2010
Ci sono parecchi errori, secondo me sarebbe meglio se riguardassi la parte relativa alla gestione delle matrici ed al loro passaggio come parametri nelle funzioni su un manuale o altro.
Comunque in generale devi modificare il passaggio delle matrici indicando ALMENO il numero di righe della matrice, e nella funzione del prodotto puoi procedere principalmente in due modi:
1. passare un parametro in più alla funzione, per indicare la matrice da riempire con
   il prodotto delle altre due matrici.
2. allocare dinamicamente una matrice, lavorarci sopra e ritornala

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 13:18
Venerdì, 09/07/2010
Testo quotato

Postato originariamente da GuglielmoS:
2. allocare dinamicamente una matrice, lavorarci sopra e ritornala



Testo quotato

Postato originariamente da HeDo:
Un modo sbagliato di farlo sarebbe quello di ritornare un puntatore ad un array allocato dinamicamente, ma ti esporresti a dei memory leak e ad una violazione del pattern funzionale del C/C++.


PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 13:40
Venerdì, 09/07/2010
Testo quotato

Postato originariamente da HeDo:

Testo quotato

Postato originariamente da GuglielmoS:
2. allocare dinamicamente una matrice, lavorarci sopra e ritornala



Testo quotato

Postato originariamente da HeDo:
Un modo sbagliato di farlo sarebbe quello di ritornare un puntatore ad un array allocato dinamicamente, ma ti esporresti a dei memory leak e ad una violazione del pattern funzionale del C/C++.



Si scusa ma non sono stato molto chiaro nel spiegarmi.

PM Quote