Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    8

    [C++]Allocazione dinamica matrice

    In sostanza dovrei leggere da input 2 interi n ed m ed allocare dinamicamente una matrice di n*m interi.
    Ho già provato a cercare una soluzione in questa sezione, ma la maggior parte utilizza funzioni (come malloc()) che non ho ancora studiato.
    Mi chiedevo inoltre come fare se dovessi passare la medesima matrice ad una funzione.

    Grazie,
    Jacopo

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    E cosa hai studiato per allocare memoria? La new ...?

  3. #3
    codice:
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    void leggimat( int **M, int dimr, int dimc ) 
    {
    	int i,j;
    
    	for(i=0;i<dimr;i++)
      {
    		for(j=0;j<dimc;j++)
        {
    			cout<<"A[ "<<i+1<<","<<j+1<<" ] = ";
    			cin>>M[i][j];
    		}
    	}
    }/* fine leggimat */
    
    
    /* Stampa in output una matrice */
    void stampamat( int **M, int dimr, int dimc )
    {
    	int i,j;
    
      for( i=0; i<dimr; i++ )
      {
      	for( j=0; j<dimc; j++ )
      	{
    			cout<<M[i][j];
        }
        cout<<endl;
      }
    }/* fine stampamat */
    
    
    
    int main()
    {
        
        int **Matrix;
        int i, rows=2, cols=2;
        
        Matrix = new( int * );
       	for(i=0;i<rows;i++)	
           Matrix[i] = new int;
        
       	/* Chiamata delle funzioni di Lettura e Stampa di Array bidimensionali */
    	  leggimat( Matrix , rows , cols );
      	
      	cout<<endl;
      	
        stampamat( Matrix , rows , cols );
        
        delete Matrix;
    
        system("PAUSE");
        return 0;
    }
    Devi utilizzare per forza new e delete, altrimenti la malloc...

    Per come passare la matrice alla funzione basta che osservi come faccio io...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    8
    Grazie mille, funziona tutto perfettamente .
    Però non ho capito bene questo pezzo

    codice:
        Matrix = new( int * );
       	for(i=0;i<rows;i++)	
           Matrix[i] = new int;
    Innanzitutto viene allocato spazio per un puntatore, giusto?
    E poi con il ciclo for allochi spazio per un "puntatore" ad ogni riga della matrice?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non capisco come ti possa funzionare senza problemi ...

    Il codice corretto per l'allocazione/deallocazione e'

    codice:
        Matrix = new int*[rows];
       	for(i=0;i<rows;i++)	
           Matrix[i] = new int[cols];
        
      // ...
    
       	for(i=0;i<rows;i++)	
           delete Matrix[i];
    	delete Matrix;
    ... del resto, nel codice di Vincent non si capisce come intervenga la variabile cols nell'allocazione ...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    8
    Nel caso mio deve essere

    codice:
    ** Matrix = new int*[rows];
       	for(i=0;i<rows;i++)	
           Matrix[i] = new int[cols];
    Così funziona!
    Ma allo stesso modo funziona anche il codice di Vincent...forse è sbagliato il modo in cui viene allocato spazio in memoria?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sì ... il codice che ti ha mostrato Vincent non e' corretto ... va a scrivere in memoria in posizioni non lecite e solo per caso non hai un errore immediato ...

    Per le delete del resto, ad ogni new ne dovrebbe corrispondere una ... mentre nel codice di Vincent ce n'e' una sola ... e cosi' non va ...

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    8
    Ok, grazie mille!

  9. #9
    chiedo scusa ragazzi ho preso un abbaglio... VVoVe:

    ieri ero molto stanco...

  10. #10
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    typedef char T;
    void inserisci_matrice (T* & , const int ,const int );
    Ma così è corretto come programma??
    se no dove sbaglio??
    a me sembra andare liscio...grazie

    int main(int argc, char *argv[])
    { int n,m;
    T * Pmat;
    cout << "\n inserisci gli indici dell Array"<< "\n numero di righe:";
    cin >> n; cout << "\n numero di colonne:"; cin >> m;
    Pmat = new T [n*m];
    inserisci_matrice (Pmat,n,m);
    system("PAUSE");
    return EXIT_SUCCESS;
    }
    void inserisci_matrice (T* &MatP , const int n,const int m){
    cout <<"\n inserisci gli elementi della matrice:";
    for (int i=0;i<n;i++){
    for (int j=0;j<m;j++){
    cout <<"\n elemento"<<i<<","<<j;
    cin >> MatP [j];
    }
    }
    }

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.