PDA

Visualizza la versione completa : C++ function con array 2D


raffo000
12-12-2014, 16:13
Come faccio a passare un array 2D ad una procedura?

Il codice della procedura è questo:
#include <iostream>
using namespace std;

int Trasposizione_Matrice(int ma[][&100], int &n) {
for (int i=0; i<*n; i++){
for (int j=0; j<*n; j++){
swap(*ma[i][j], *ma[j][i]);
}
}
return (*ma[*n][*n]);
}

il main invece:
#include <iostream>
#include <cstdlib>
#include <C:\Users\Raffaele\Desktop\10 Gennaio\Trasposizione_Matrice.h>
using namespace std;
int Trasposizione_Matrice (int &ma[][100], int &n);


main () {
int n;
cin>>n;
int ma[n][n];

for (int i=0; i<n; i++){
for (int j=0; j<n; j++){
ma[i][j]=rand()%10+1;
}
}

for (int i=0; i<n; i++){
for (int j=0; j<n; j++){
cout<<ma[i][j]<<" ";
}
cout<<endl;
}

int Trasposizione_Matrice (ma, n);


for (int i=0; i<n; i++){
for (int j=0; j<n; j++){
cout<<ma[i][j]<<" ";
}
cout<<endl;
}
}

minomic
12-12-2014, 16:39
Ciao, puoi leggere qui (http://www.cplusplus.com/forum/beginner/73432/). Comunque ti posto un MWE (Minimal Working Example):



#include <iostream>


using namespace std;


void stampaMatrice(int **matrice, int righe, int colonne)
{
for(int i=0; i<righe; i++) {
for(int j=0; j<colonne; j++) {
cout << matrice[i][j] << " ";
}
cout << endl;
}
}


int main()
{
int **matrice = new int*[3];
int count = 1;
for(int i=0; i<3; i++) {
matrice[i] = new int[3];
for(int j=0; j<3; j++) {
matrice[i][j] = count++;
}
}


stampaMatrice(matrice, 3, 3);


// cancella la matrice...


return 0;
}



Alloco dinamicamente una matrice 3x3, la riempio con i numeri da 1 a 9, e poi la passo a una funzione che la stampa.

raffo000
30-12-2014, 16:26
Ho applicato il tutto e il codice dovrebbe essere questo:
#include <iostream>
#include <cstdlib>
using namespace std;


int Trasposizione_Matrice( int n, int r, int **p1) {
int cont=0;
for (int i=0; i<r; i++){
for (int j=i+1; j<n; j++){
if(i!=j) swap(p1[j][i], p1[i][j]); cont++;
}
}
cout <<cont;
return (p1[n][n]);
}


int main () {
char risp; int max;
int n;
int r; cout<<"Inserisci il numero di righe: "; cin>>r;
int c; cout<<"Inserisci il numero di colonne: "; cin>>c;
if(r>=c){n=r;} else {n=c;}
int ma[n][n];


do { //Chiede all'utente se per comodità vuole generare dei numeri in modo automatico, se la risposta
risp=' ';
cout<<"Vuoi generare i valori della matrice casualmente? (y/n) "; cin>>risp; //Inserisce la risposta in una variabile char
if(risp!='y' and risp!='n'){cout<<"Scelta non consentita\n";} //Se la risposta non è ne y ne n allora restituisce un errore
} while (risp!='y' and risp!='n'); //Chiede all'utente di reinserire la risposta in caso di errore

if(risp=='y'){ //Se l'utente decide di generare automaticamente l'array chiede quaale deve essere
cout<<"Inserisci il valore massimo della matrice: "; cin>>max; cout<<endl;
for (int i=0; i<r; i++){
for (int k=0; k<c; k++){
ma[i][k]=rand()%max+1;
}
}
} else {
cout<<"Inserisci i valori del vettore:\n"; //Se la risposta è negativa chiede all'utente di inserire i valori manualmente
for (int i=0; i<r; i++){
for (int k=0; k<c; k++){
cin>>ma[i][k];
}
}
}
cout<<"Matrice normale:\n";
for (int i=0; i<r; i++){
for (int k=0; k<c; k++){
cout.width(3);
cout<<ma[i][k]<<" ";
} cout<<endl<<endl;
}

int **p1=new int*[n];
for (int i=0; i<r; i++){
p1[i]=new int[n];
for (int k=0; k<c; k++){
p1[i][k]=ma[i][k];
}
}

Trasposizione_Matrice (n, r, p1);

cout<<endl<<"Matrice trasposta:\n";
for (int i=0; i<c; i++){
for (int k=0; k<r; k++){
cout.width(3);
cout<<ma[i][k]<<" ";
} cout<<endl<<endl;
}
cout<<endl;
system("pause");
}


Ma quando eseguo dopo l'uso della funzione crasha; penso che il problema sia il return.
Consigli?

minomic
30-12-2014, 17:16
A occhio direi che c'è qualcosa di sbagliato nel modo in cui utilizzi la variabile "n". Forse intendi "trasformare" la matrice in una matrice quadrata prendendo il massimo delle dimensioni? Così facendo però c'è il rischio di andare a leggere in posizioni che non appartengono alla matrice stessa... Puoi anche fare in modo che la funzione di trasposizione restituisca una nuova matrice, così dovresti eliminare completamente il problema.

raffo000
30-12-2014, 17:49
si diciamo che l'intenzione era quella, volevo svolgere l'operazione sulla stessa matrice, ho buttato giu velocemente qualcosa del genere usando due array ma restituisce valori raw nel secondo array, nn so cosa fare
#include <iostream>
#include <cstdlib>
using namespace std;


int** Trasposizione_Matrice( int n, int m, int **&p1, int **&p2) {
int cont=0;
for (int i=0; i<n; i++){
for (int j=0; j<m; j++){
p2[j][i]=p1[i][j]; cont++;
}
}
cout<<cont<<endl;
return(p2);
}


int main () {
char risp; int max;
int n; cout<<"Inserisci il numero di righe: "; cin>>n;
int m; cout<<"Inserisci il numero di colonne: "; cin>>m;
int ma[n][m];
int mb[m][n];
int **p1=new int*[n]; for(int i=0;i<n;i++){ p1[i] = new int[m];}
int **p2=new int*[m]; for(int i=0;i<m;i++){ p2[i] = new int[n];}
for (int i=0; i<m; i++){for (int j=0; j<n; j++){mb[i][j]=0;}}



do { //Chiede all'utente se per comodità vuole generare dei numeri in modo automatico, se la risposta
risp=' ';
cout<<"Vuoi generare i valori della matrice casualmente? (y/n) "; cin>>risp; //Inserisce la risposta in una variabile char
if(risp!='y' and risp!='n'){cout<<"Scelta non consentita\n";} //Se la risposta non è ne y ne n allora restituisce un errore
} while (risp!='y' and risp!='n'); //Chiede all'utente di reinserire la risposta in caso di errore

if(risp=='y'){ //Se l'utente decide di generare automaticamente l'array chiede quaale deve essere
cout<<"Inserisci il valore massimo della matrice: "; cin>>max; cout<<endl;
for (int i=0; i<n; i++){
for (int k=0; k<m; k++){
ma[i][k]=rand()%max+1;
}
}
} else {
cout<<"Inserisci i valori del vettore:\n"; //Se la risposta è negativa chiede all'utente di inserire i valori manualmente
for (int i=0; i<n; i++){
for (int k=0; k<m; k++){
cin>>ma[i][k];
}
}
}
cout<<"Matrice normale:\n";
for (int i=0; i<n; i++){
for (int k=0; k<m; k++){
cout.width(3);
cout<<ma[i][k]<<" ";
} cout<<endl<<endl;
}

for(int i=0; i<n; i++){
}

Trasposizione_Matrice (n, m, p1, p2);

cout<<endl<<"Matrice trasposta:\n";
for (int i=0; i<m; i++){
for (int k=0; k<n; k++){
cout.width(3);
cout<<p2[i][k]<<" ";
} cout<<endl<<endl;
}
system("pause");
}

questi puntatori mi uccideranno

Loading