Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    10

    C++ function con array 2D

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

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao, puoi leggere qui. Comunque ti posto un MWE (Minimal Working Example):

    codice:
    #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.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    10
    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?

  4. #4
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    10
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.