Segmentation float when starting the function for the second time

Asked

Viewed 32 times

0

I created a program in c++ to manipulate matrices,and I divided the source code into 2 files, one with functions and the other with implementation, all functions work correctly, but when starting any function for the second time,returns a float Segmentation error, any function started for 1 time works perfectly,I would like a help, thanks in advance.

//main.cpp

#include <iostream>
#include "func.cpp"
using namespace std;    
int main()
{

matriz *m1 = criaMatriz(5,5);
atribuiMatriz(2,1,m1,45.4);
//cout << linhasMatriz(m1) << endl;
//cout << *(*((*m1).mat + 1)) << endl;
//cout << m1 << endl;
cout << acessaMatriz(2,1,m1) << endl;
//cout << m1 << endl;
cout << acessaMatriz(2,1,m1) << endl;
//cout << (*m1).lin << endl;

//cout << linhasMatriz(m1) << endl;
//liberaMatriz(m1);
return 0;
}

//func.cpp

Citation

#include <iostream>
using namespace std;
struct matriz
{
int lin;
int col;
double **mat;
}typedef matriz;

matriz* criaMatriz(int lin,int col)
{
matriz *a,b;
a = &b;
(*a).lin = lin;
(*a).col = col;
(*a).mat = new double*[lin];
for(int i = 0;i < lin;i++)
    *((*a).mat + i) = new double[col];
//okokokokok
return a;

}
void liberaMatriz(matriz *a)
{
int lin = (*a).lin;
for(int i = 0;i < lin;i++)
    delete[] *((*a).mat + i);
delete[] (*a).mat;
}
double acessaMatriz(int lin,int col,matriz *a)
{

return *(*((*a).mat + lin - 1) + col - 1);
}
void atribuiMatriz(int lin,int col,matriz *a,double comp)
{

*(*((*a).mat + lin - 1) + col - 1) = comp; 
}  
int linhasMatriz(matriz *a)
{
int lin = (*a).lin;
return lin;
}
int colunasMatriz(matriz *a)
{
return (*a).col;
}
  • Looking so close, include files cpp or c is seriously disheartened. The function criaMatriz is returning a local address which will never work.

  • It’s really messed up: return *(*((*a).mat + lin - 1) + col - 1);

1 answer

0

Avoid including files .cpp in your fonts, this causes a mess without size!

Create a settings file .h containing the prototypes of the functions and include it.

matrix. h:

#ifndef __MATRIZ_H__
#define __MATRIZ_H__

typedef struct matriz_s
{
    int lin;
    int col;
    double ** mat;
} matriz_t;


matriz_t * criaMatriz( int lin, int col );
void liberaMatriz( matriz_t * m );
double acessarMatriz( matriz_t * m, int lin, int col );
void atribuiMatriz( matriz_t * m, int lin, int col, double val );
void exibeMatriz( matriz_t * m );

#endif

cpp matrix.:

#include <iostream>
#include "matriz.h"

matriz_t * criaMatriz( int lin, int col )
{
    matriz_t * m = new matriz_t;

    m->lin = lin;
    m->col = col;

    m->mat = new double* [lin];

    for( int i = 0; i < lin; i++ )
        m->mat[i] = new double [col];

    return m;
}


void liberaMatriz( matriz_t * m )
{
    for( int i = 0; i < m->lin; i++)
        delete[] m->mat[i] ;
    delete [] m->mat;
    delete m;
}


double acessarMatriz( matriz_t * m, int lin, int col )
{
    return m->mat[lin % m->lin][col % m->col];
}


void atribuiMatriz( matriz_t * m, int lin, int col, double val )
{
    m->mat[lin % m->lin][col % m->col] = val;
}


void exibeMatriz( matriz_t * m )
{
    for( int i = 0; i < m->col; i++ )
    {
        for( int j = 0; j < m->lin; j++ )
            std::cout << m->mat[j][i] << "\t";

        std::cout << std::endl << std::endl;
    }
}

main.cpp

#include <iostream>
#include "matriz.h"

int main( void )
{
    matriz_t * m1 = criaMatriz( 3, 4 );

    atribuiMatriz( m1, 0, 0, 3.1415 );
    atribuiMatriz( m1, 1, 0, 7.1234 );
    atribuiMatriz( m1, 2, 0, 8.5353 );

    atribuiMatriz( m1, 0, 1, 0.0001 );
    atribuiMatriz( m1, 1, 1, 3.0010 );
    atribuiMatriz( m1, 2, 1, 4.4444 );

    atribuiMatriz( m1, 0, 2, 5.1232 );
    atribuiMatriz( m1, 1, 2, 0.8989 );
    atribuiMatriz( m1, 2, 2, 9.9999 );

    atribuiMatriz( m1, 0, 3, 5.5555 );
    atribuiMatriz( m1, 1, 3, 4.3232 );
    atribuiMatriz( m1, 2, 3, 1.3232 );

    exibeMatriz( m1 );

    liberaMatriz( m1 );

    return 0;
}

Compiling:

$ g++ main.cpp matriz.cpp -o matriz

Exit:

3.1415  7.1234  8.5353  

0.0001  3.001   4.4444  

5.1232  0.8989  9.9999  

5.5555  4.3232  1.3232  

Browser other questions tagged

You are not signed in. Login or sign up in order to post.