class - c++ segmentation fault when copying a matrix -
i'm having problem matrix, , problem when try copy it gives me error 'segmentation fault'. code involved:
main.cpp
void principal(tauler &tauler) { generadorpuzzle puzzle; pilamoviments pilamovs; int npuzzle, cont=0; bool valid; cout << "joc del rush hour" << endl; cout << "entra el puzzle jugar:" << endl; cin >> npuzzle; valid=puzzle.espuzzlevalid(npuzzle); if(!valid) { { cout << "puzzle no valid. entra el puzzle jugar:" << endl; cin >> npuzzle; valid=puzzle.espuzzlevalid(npuzzle); }while(!valid); } puzzle.posarpuzzleactiu(npuzzle); tauler=tauler(puzzle.midapuzzle(),puzzle.totalvehicles()); for(int i=0;i<puzzle.totalvehicles();i++) { vehicle v(cont, puzzle.midavehicle(i),puzzle.filavehicle(i),puzzle.columnavehicle(i),puzzle.direcciovehicle(i)); valid=tauler.esvalid(v); if(valid) { tauler.processar(v,cont); cont++; } } } int main() { pilamoviments pilamovs; tauler tauler; char opcio; principal(tauler); tauler.mostrar(); mostrarmenu(); { cout << "entra opcio:" << endl; cin >> opcio; tractaropcio(tauler,pilamovs,opcio); }while(opcio!='x'); return 0; }
tauler.cpp
tauler::tauler() { a_f=a_surt=a_n=a_valids=0; a_mp=null; } tauler::tauler(const tauler &t) { a_f=t.a_f; a_n=t.a_n; a_surt=t.a_surt; a_valids=t.a_valids; reservarmemoria(); copiar(t); } tauler::tauler(int nf, int nv) { a_f=nf; a_n=nv; a_v=new vehicle[a_n]; reservarmemoria(); for(int j=0;j<a_f;j++) for(int i=0;i<a_f;i++) a_mp[i][j]='-'; } tauler::~tauler() { alliberarmemoria(); } // operadors tauler& tauler::operator=(const tauler& y) { if (this!=&y) { alliberarmemoria(); reservarmemoria(); copiar(y); } return *this; } // metodes privats void tauler::copiar(const tauler &t) { a_f=t.a_f; a_n=t.a_n; a_surt=t.a_surt; a_valids=t.a_valids; for(int i=0;i<a_f;i++) { for(int j=0;j<a_f;j++) a_mp[i][j]=t.a_mp[i][j]; } } void tauler::alliberarmemoria() { for(int i=0;i<a_f;i++) delete [] a_mp[i]; // s'alliberen les taules horitzontals delete [] a_mp; } void tauler::reservarmemoria() { a_mp=new char*[a_f]; for(int i=0;i<a_f;i++) a_mp[i]=new char[a_f]; }
tauler.h
#ifndef tauler_h #define tauler_h #include "vehicle.h" #include "pilamoviments.h" class tauler { // la classe que guardara la informacio del tauler public: // constructors destructor tauler(); //pre: --; post: posa tauler per defecte. tauler(int nf, int nv); //pre: nf nv entrats correctament. post: posa tauler amb les files el nombre de vehicles que li hem entrat. tauler(const tauler &t); //pre: tauler correcte. post: fa una copia de tauler li diu t. ~tauler(); //pre: --; post: memoria alliberada. // operador tauler &operator=(const tauler &e); // consultors int files() const; //pre: files del tauler correctes. post: retorna les files columnes del tauler. int filasurtida() const; //pre: files del tauler correctes. post: retorna la fila de surtida del tauler. int vehicles() const; //pre: a_valids del tauler correctes. post: retorna el nombre de vehicles valids del tauler. bool fipartida() const; //pre: vehicle 'a' al tauler. post: retorna true si el vehicle 'a' esta la ultima columa de la fila de surtida, altrament retorna false. bool esvalid(vehicle v) const; //pre: parametres del vehicle v entrats correctament. post: retorna true si el vehicle es pot posar correctament dins el tauler. false si no es pot posar. bool xoquen(vehicle v, moviment m) const; //pre: parametres del vehicle v, files cols entrats correctament. post: retorna true si no hi ha cap altre vehicle bloquegi el desplaçament. si n'hi ha algun retorna false. void mostrar() const; //pre: tauler ple. post: mostra per pantalla totes les posicions del tauler amb els vehicles. // modificadors void posarvehicle(char a, vehicle v); //pre: correcte vehicle v valid. post: coloca el vehicle del puzzle al tauler al lloc que li toca. void processar(vehicle v, int cont); //pre: vehicle v valid cont>=0. post: assigna una lletra al vehicle si es el primer horitzontal guarda la fila com fila de surtida. bool validarmov(moviment m); //pre: --; post: retorna false si la lletra no es de cap vehicle del taulell, o si el moviment no es pot fer, altrament retorna true. void fermov(pilamoviments pilamovs, moviment m); //pre: parametres lletra, files cols correctes. post: mou el vehicle que tingui la lletra entrada les files columnes que ens entren empila el moviment la pila. void desfermov(pilamoviments pilamovs); //pre: movimetns de la pila >0. (no es pot desfer moviments si no n'hi ha cap). post: desfa l'ultim moviment el desempila de la pila de moviments. bool movpossible(vehicle v, int files, int cols); private: // taula de vehicles vehicle * a_v; int a_valids; // atributs pilamoviments a_pila; int a_f; int a_n; int a_surt; char ** a_mp; // metodes void alliberarmemoria(); void reservarmemoria(); void copiar(const tauler &t); }; #endif // tauler_h
when start it, asks puzzle should, crashes in line:
a_mp[i][j]=t.a_mp[i][j];
in 'copiar' method. undertand i'm giving a_mp[i][j] value don't know, don't know how fix it, ideas? know names aren't in english hope isn't problem.
thanks lot edit: deleted iniciar(), wasn't cause of problem
it looks operator=
starts freeing current memory (ok), allocating memory (but how should allocated?) , copy.
if source size bigger destination size going overwrite memory not allocated.
before calling memory allocator should first set a_f
, a_n
correct values.
Comments
Post a Comment