[C++] errore codice

Ster24
Praticamente dopo aver letto una matrice da file quadrata di interi ho creato una funzione che cerca il minimo in un vettore di interi e restituisce l'indice del valore minimo e con l'aiuto di un'altra funzione devo sommare agli elementi della matrice con indice dato dall'altra funzione una costante.
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

typedef int matrice [50][50];
typedef int vettore [50];

void leggi_mat( matrice , int&);



void leggi_mat( matrice mat, int&riemp) {
     ifstream input;
     int i,j;
     input.open( "mat.txt");
     if(input.fail())
     exit(1);
     input>>riemp;
     for(i=0;i<riemp;i++)
      for(j=0;j<riemp;j++)
      input>>mat[i][j];
      input.close ();
     
     
     
     
     }

int calc_ind_min( vettore v,int riemp) {
    int i;
    int pos_min;
    
    int min=v[0];
    for(i=0;i<riemp;i++)
    if( v[i]<min){
    min=v[i];
    pos_min=i;
}
return pos_min;
    
}









void somma( matrice mat, int riemp, int t){
    
t=4;
int i,j;
for(i=0;i<riemp;i++)
for(j=0;j<riemp;j++)
if( j==calc_ind_min( mat[i],riemp)){
mat[i][j]= mat[i][j]+t;}









}





int main(int argc, char *argv[])
{
    matrice m;
    int r,k,t;
    
    
     leggi_mat( m , r) ;
   somma(m,  r, t);
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}








Risposte
sapo931
Ho sistemato l'indentazione del codice, cosi è più leggibile.
Il codice compila con due warning, tutti e due per variabile non inizializzata (r e t)

Ho due domande:

1) come mai nella funzione leggi_mat metti l'input in int &riemp?
2) come mai hai t=4 nella funzione somma e non viene passato come argomento? Se non viene mai inizializzato viene dato warning.

puoi mettere un esempio di file mat.txt cosi vedo come si comporta a runtime?
(A te che errore da?)

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

typedef int matrice [50][50];
typedef int vettore [50];


void leggi_mat( matrice , int&);


void leggi_mat( matrice mat, int &riemp) {

	ifstream input;
    
	input.open( "mat.txt");
    
	if (input.fail()) {
		 
		exit(1);
		
	}
	
    input >> riemp; 
    
    for (int i = 0; i < riemp; i++) {

		for (int j = 0; j < riemp; j++) {
		
			input >> mat[i][j];
      
			input.close ();
			
		}
     
	}     
     
}


int calc_ind_min ( vettore v, int riemp) {
	
   int pos_min;
   
    int min = v[0];
    
    for (int i = 0; i < riemp; i++) {
		
		if ( v[i] < min ){
		
			min = v[i];
		
			pos_min = i;
	
		}
		
	}
	
	return pos_min;
   
}


void somma ( matrice mat, int riemp, int t) {
   
	t = 4;
	
	for (int i = 0; i < riemp; i++) {
		
		for (int j = 0; j < riemp; j++) {
			
			if ( j == (calc_ind_min( mat[i], riemp)) ) {
				
				mat[i][j] = mat[i][j] + t;
				
			}
			
		}
		
	}
	
}


int main (int argc, char *argv[]) {
	
    matrice m;
    
    int r,k,t;
   
    leggi_mat( m , r) ;
	
    somma(m,  r, t);   
   
    system("PAUSE");
    
    return EXIT_SUCCESS;

}

Ster24
A me va bene, compila tutto . Solo che se provo a stampare la nuova matrice mi da uno 0 a video.. Cmq il mio file di testo è
2
1 2
3 4
Per le tue domande, sono miei errori scusa...

vict85
Riguardo a riemp lo scopo è che il valore di riemp sia visto nel main. Puoi o far così o far ritornare il valore. Dovresti comunque controllare che riemp non si troppo grande.

Per quanto riguarda t=4 direi che non ha alcun senso, dovrebbe essere inializzata nel main.

Comunque
(calc_ind_min( mat[i], riemp))
è indipendente da \(\displaystyle j \), quindi dovresti spostarlo al di fuori del secondo for. Insomma lo stai trasformando da un algoritmo \(\displaystyle 2n^2 \) in uno \(\displaystyle n^3 \).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.