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

Popular posts from this blog

linux - Does gcc have any options to add version info in ELF binary file? -

android - send complex objects as post php java -

charts - What graph/dashboard product is facebook using in Dashboard: PUE & WUE -