Ho un problema, sempre più frequente, di segmentation fault; ho controllato il codice molte volte ma non riesco a trovare l'errore.
Potreste aiutarmi? Grazie mille
Testo dell'esercizio: Sia dato un file F1 residente su memoria di massa e contenente di una matrice NxM di stringhe. Sulla prima riga del file sono presenti N ed M.Scrivere un programma modulare che determini e stampi la matrice dopo aver spostato le righe in modo da essere ordinate in senso crescente relativamente alla somma delle lunghezze delle stringhe in esse presenti: in altri termini la prima riga deve riportare la riga della matrice di partenza che presenta il valore della somma delle lunghezze delle stringhe più piccola; l’ultima riga quella che presenta il valore della stessa somma più grande.
Codice sorgente:
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdlib.h>
using namespace std;
void prendi_dim_mat(fstream &file,int &dim_r,int &dim_c);
string **alloca_mat(int dim_r,int dim_c);
int *alloca_vet_somme(int dim_r);
void order_vet_somme(int *vet,int dim);
void riempi_mat(string **mat,int dim_r,int dim_c,int *vet,fstream &file);
int main()
{
fstream file;
string **mat;
int *vet_somme;
int N,M;
prendi_dim_mat(file,N,M);
mat=alloca_mat(N,M);
vet_somme=alloca_vet_somme(N);
riempi_mat(mat,N,M,vet_somme,file);
}
void prendi_dim_mat(fstream &file,int &dim_r,int &dim_c)
{
int i,j;
file.open("file.txt",ios::in);
if(!file)
{
cout<<"Impossibile aprire file";
exit(1);
}
file>>dim_r;
file>>dim_c;
file.close();
}
string **alloca_mat(int dim_r,int dim_c)
{
int i;
string **matrice;
matrice=new string*[dim_c];
for(i=0;i<dim_c;i++)
matrice=new string[dim_r];
return matrice;
}
int *alloca_vet_somme(int dim_r)
{
int *vet;
vet=new int[dim_r*2];
return vet;
}
void order_vet_somme(int *vet,int dim)
{
bool scambiato=false;
int tmp,i,tmp1;
do
{
scambiato=false;
for(i=0;i<dim-1,i%2==0;i++)
{
if (vet>vet[i+2] && i+3<dim)
{
tmp=vet[i+2];
vet[i+2]=vet;
vet=tmp;
tmp1=vet[i+3];
vet[i+3]=vet[i+1];
vet[i+1]=tmp1;
scambiato=true;
}
}
}while(scambiato==true);
}
void riempi_mat(string **mat,int dim_r,int dim_c,int *vet,fstream &file)
{
int tmp,i=0,j=0,k=0;
file.open("file.txt",ios::in);
if(!file)
{
cout<<"Impossibile aprire file";
exit(1);
}
file>>tmp;
file>>tmp;
while(!file.eof())
{
file>>mat[j];
j++;
if(j==dim_c)
{
i++;
j=0;
}
}
file.close();
for(i=0;i<dim_r;i++)
{
for(j=0;j<dim_c;j++)
{
if(j==0)
{
vet[k]=mat[j].length();
}else
{
vet[k]=vet[k]+mat[j].length();
}
}
k++;
vet[k]=i;
k++;
}
order_vet_somme(vet,k);
cout<<"MATRICE ORDINATA"<<endl;
for(i=1;i<k,i%2!=0;i++)
{
for(j=0;j<dim_c;j++)
{
cout<<mat[vet][j]<<" ";
}
cout<<endl;
}
}
file.txt:
3 4
caricatore yoga hey rex
bailando mouse tastiera pc
save mode shift control