[C++] Lettura Matrice

di il
10 risposte

[C++] Lettura Matrice

Ciao a tutti, sono nuova ed avrei bisogno di una mano.
In sostanza devo leggere una matrice da un file di testo e ho scritto un codice nel quale scrivo tutto nel main e l'altro invece dove suddivido in funzioni. Il primo compila e funziona, il secondo viene compilato ma al momento dell'esecuzione si blocca. Qualcuno può spiegarmi perchè ed aiutarmi? Grazie in anticipo! Vi posto i codici
Il file di testo contiene i seguenti dati:
3
4
1 3 0 2
7 0 6 1
8 5 4 9


Primo codice:
#include <iostream>
#include <fstream>

using namespace std;


int main(){

	char file[20];
	int R, C, i, j;

	//lettura file


	cout << "Come si chiama il file da aprire? \n" << endl;
	cin >> file;

	fstream matrice;

	matrice.open(file , ios::in);

	//lettura numero righe

	matrice >> R >> C;

	//allocazione dinamica matrice

	double **matrix;

	matrix = new double*[R];

	for(i = 0; i < R; i++){

		matrix[i] = new double[C];
	}

	//lettura della matrice da file
	
	for(i = 0; i < R ; i++){

		for (j = 0; j < C; j++){

			matrice >> matrix[i][j];
		}
	}

	//stampa della matrice

	for(i = 0; i < R; i++){

		cout << "\n" << endl;

		for( j = 0; j < C; j++){

			cout << matrix[i][j];
		}
	}
Secondo codice:
#include <iostream>
#include <fstream>

using namespace std;

double **alloc(int R, int C) {

	double **matrix;

	matrix = new double*[R];

	for(int i = 0; i < R; i++){

		matrix[i] = new double[C];
	}

	return matrix;
}

double **dim_alloc(){

	char file[20];
	int R, C, i, j;
	double **matrix;

	cout << "Come si chiama il file da aprire? \n" << endl;
	cin >> file;

	fstream matrice;

	matrice.open(file , ios::in);

	//lettura numero righe

	matrice >> R >> C;

	cout << R << C << endl;

	//Allocazione della matrice

	alloc(R, C);

	

	for(int i = 0; i < R ; i++){

		for (int j = 0; j < C; j++){

			matrice >> matrix[i][j];
		}
	}
	

}



int main(){

double **matrix;
int R, C, i, j;


dim_alloc();



/*
for(i = 0; i < R; i++){

		cout << "\n" << endl;

		for(j = 0; j < C; j++){

			cout << matrix[i][j];
		}
	}

*/
}

10 Risposte

  • Re: [C++] Lettura Matrice

    Probabilmente manca solo questo

    matrix = alloc(R, C);

    ma la dim_alloc non deve restituire nulla (deve essere void).
  • Re: [C++] Lettura Matrice

    oregon ha scritto:


    Probabilmente manca solo questo

    matrix = alloc(R, C);

    ma la dim_alloc non deve restituire nulla (deve essere void).
    Ho provato ma nulla, blocca sempre l'esecuzione
  • Re: [C++] Lettura Matrice

    Hai "provato" come ...? Posta il codice attuale che hai corretto.

    E cosa vuol dire "bloccato"? Hai un errore specifico?
  • Re: [C++] Lettura Matrice

    Graffa in chiusura a parte nemmeno il primo codice funziona correttamente.
    La matrice ha 4 colonne e 5 righe, non 4 e 3...poi anziché lasciare quei buchi metterei degli 0.

    Non riesco ad interpretare correttamente:
    matrice >> R >> C;
    la quale a quanto pare non inizializza R e C come dovrebbe.

    Edit: stupidaggine, ho appena capito a che servono quei due numeri in solitarlia...stare 8 ore davanti al pc non è di grande aiuto
  • Re: [C++] Lettura Matrice

    In realtà fai confusione nelle varie chiamate ... la dim_alloc DEVE restituire il puntatore alla matrice ma non lo fa.
  • Re: [C++] Lettura Matrice

    Cooooomunque carissima etta, non puoi pretendere che R e C nel main abbiano i valori corretti se non li passi per indirizzo a dim_alloc(), dato che è essa che li inizializza.

    P.S. ci sono alcuni rigiri inutili e hai dimenticato di liberare la memoria allocata...ti posto il tuo codice corretto, poi se ho tempo sfoltisco qua e la alcune cose...guarda se ti torna:
    
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    double ** alloc(int R, int C) {
    
       double **matrix;
    
       matrix = new double*[R];
    
       for(int i = 0; i < R; i++){
          matrix[i] = new double[C];
       }
    
       return matrix;
    }
    
    
    double ** dim_alloc(int &R, int &C){
    
       char file[20];
       double **matrix;
    
       cout << "Come si chiama il file da aprire?\n" << endl;
       cin >> file;
    
       fstream matrice;
       matrice.open(file , ios::in);
    
       //lettura numero righe
       matrice >> R >> C;
    
       cout << "numero di righe: " << R << " numero di colonne: " << C << endl;
    
       //Allocazione della matrice
       matrix = alloc(R, C);
    
       
       for(int i = 0; i < R ; i++){
          for (int j = 0; j < C; j++){
             matrice >> matrix[i][j];
          }
    	}
       
    	return matrix;
    }
    
    
    
    int main(){
    
    double **matrix;
    int R, C, i, j;
    
    matrix = dim_alloc(R, C);
    
    for(i = 0; i < R; i++){
    	for(j = 0; j < C; j++){
    		cout << matrix[i][j] << " ";
    	}
    	cout << endl;
    }
    
    for(i = 0; i < R; i++){
    	delete[] matrix[i];
    }
    delete[] matrix;
    
    }
    
  • Re: [C++] Lettura Matrice

    jfet ha scritto:


    Cooooomunque carissima etta, non puoi pretendere che R e C nel main abbiano i valori corretti se non li passi per indirizzo a dim_alloc(), dato che è essa che li inizializza.

    P.S. ci sono alcuni rigiri inutili e hai dimenticato di liberare la memoria allocata...ti posto il tuo codice corretto, poi se ho tempo sfoltisco qua e la alcune cose...guarda se ti torna:
    
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    double ** alloc(int R, int C) {
    
       double **matrix;
    
       matrix = new double*[R];
    
       for(int i = 0; i < R; i++){
          matrix[i] = new double[C];
       }
    
       return matrix;
    }
    
    
    double ** dim_alloc(int &R, int &C){
    
       char file[20];
       double **matrix;
    
       cout << "Come si chiama il file da aprire?\n" << endl;
       cin >> file;
    
       fstream matrice;
       matrice.open(file , ios::in);
    
       //lettura numero righe
       matrice >> R >> C;
    
       cout << "numero di righe: " << R << " numero di colonne: " << C << endl;
    
       //Allocazione della matrice
       matrix = alloc(R, C);
    
       
       for(int i = 0; i < R ; i++){
          for (int j = 0; j < C; j++){
             matrice >> matrix[i][j];
          }
    	}
       
    	return matrix;
    }
    
    
    
    int main(){
    
    double **matrix;
    int R, C, i, j;
    
    matrix = dim_alloc(R, C);
    
    for(i = 0; i < R; i++){
    	for(j = 0; j < C; j++){
    		cout << matrix[i][j] << " ";
    	}
    	cout << endl;
    }
    
    for(i = 0; i < R; i++){
    	delete[] matrix[i];
    }
    delete[] matrix;
    
    }
    
    Grazie mille davvero, perdonami ma sono alle prime armi e mi sono incartata
  • Re: [C++] Lettura Matrice

    @etta saresti potuta arrivare anche tu, riflettendo piano piano, con i consigli ... senza codice pronto ...
  • Re: [C++] Lettura Matrice

    oregon ha scritto:


    @etta saresti potuta arrivare anche tu, riflettendo piano piano, con i consigli ... senza codice pronto ...
    Un primo esempio "di riferimento" male non fa, purché non diventi un'abitudine
  • Re: [C++] Lettura Matrice

    jfet ha scritto:


    oregon ha scritto:


    @etta saresti potuta arrivare anche tu, riflettendo piano piano, con i consigli ... senza codice pronto ...
    Un primo esempio "di riferimento" male non fa, purché non diventi un'abitudine
    Assolutamente no Il codice che dovevo fare non comprendeva solo questo. La lettura da file era il mio unico dubbio, per il resto l'ho completato senza problemi
Devi accedere o registrarti per scrivere nel forum
10 risposte