Oppure

Loading
09/07/10 10:46
oliverissimo
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' :)
#include <iostream>
using namespace std;

void zero (int Arr[][])            // (err) inizializza un vettore [][] mettendo zero a  
{	                           // tutti gli spazi
	for (int i=0;i<3;i++)
	{
		for (int j=0;j<3;j++)  
		{
			Arr[i][j]=0;  // err
			}
		}
	} 

void cmat (int Arr[][])                   // stampa un vettore        err
{	
	for (int i=0;i<3;i++)
	{
		cout<<endl;
		for (int j=0;j<3;j++)  
		{
			cout<<Arr[i][j]<<"\t";       // err
			}
		}
	}

void matrice (int Arr[][])            // inserisco matrice    err
{
	for (int i=0; i<3; i++)
	{
		for (int j=0; j<3; j++)
		{
		cout<<"Inserisci gli elementi della matrice ["<<i<<"] ["<<j<<"] = ";
		cin>>Arr[i][j];      //  err
			}
		}
	}	
	
int prodotto (int Arr[][],int Brr[][])     // fa' il prodotto tra 2 matrici  err
{
	int Crr;
	
	for (int j=0; j<3; j++)
	{
		for (int k=0; k<3; k++)
		{
			Crr[j][k]=0;  // inizializzo
			
			for (int i=0;i<3;i++ )
			{
				Crr[j][k]=Crr[j][k]+( (Arr[j][i])*(Brr[i][k]) );
				}
			}
		}	
	return Crr [][];
	}	

int main()
{
	int A[3][3];
	int B[3][3];
	int Crr[3][3];

	zero(Crr);
	
	cout<<"PRODOTTO TRA DUE MATRICI\n\nPrima matrice: \n";	
	matrice(A);
	cout<<"Seconda matrice: \n";
	matrice(B);
	
	Crr[3][3]=prodotto(A,B);
	
	cout<<"\n\nIl prodotto tra le due matrici e': ";
	cmat(Crr);
		
	return 0;
	}


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-)
aaa
09/07/10 11:06
HeDo

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);

aaa
09/07/10 11:09
GuglielmoS
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
aaa
09/07/10 11:18
HeDo
Postato originariamente da GuglielmoS:
2. allocare dinamicamente una matrice, lavorarci sopra e ritornala


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++.
aaa
09/07/10 11:40
GuglielmoS
Postato originariamente da HeDo:

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


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.
aaa