c++ - Segmentation fault in overloaded operator>> -


i'm trying write code orthogonal linked sparse matrix.

here's question:
alternative linked representation sparse matrices uses nodes have fields down, right, row, col, , value. each non-zero entry of sparse matrix represented node. 0 terms not explicitly stored. nodes linked form 2 circular lists. rst list, row list, made linking nodes rows , within rows columns using right field. second,list, column list, made linking nodes via down field. in list, nodes linked columns , within columns rows. these 2 lists share common header node. in addition, node added dimensions of matrix.

the input file looks this:

// matrix

4 4 7
1 1 2
1 4 1
2 2 7
3 1 9
3 3 8
4 2 4
4 3 5

// matrix b

4 4 5
1 3 4
2 1 6
2 3 3
3 2 5
4 4 9

this code operator>>:

istream& operator>>(istream& in, orthogonallinkedsparsematrix& x){      in >> x.numrows >> x.numcols >> x.numterms;     in >> x.currentnode->row >> x.currentnode->col >> x.currentnode->value;     x.push_back(x.currentnode);     if((x.currentnode->row == 1)&&(x.currentnode->col == 1)){          x.hnode->right = x.currentnode;         x.hnode->down = x.currentnode;     }     if(x.currentnode->col == 1){         x.hnode->down = x.currentnode;     }     if(x.currentnode->row == 1){         x.hnode->right = x.currentnode;     }      (int = 2; <= x.numterms; i++) {          in >> x.currentnode->row >> x.currentnode->col >> x.currentnode->value;          x.push_back(x.currentnode);      }       return in;  } 

it compiles fine. when try running it, keep getting segmentation fault error.
can help?? bunch!

here's orthogonallinkedsparsematrix.h:

#ifndef o_l_sparse_matrix_h  #define o_l_sparse_matrix_h    #include <iostream>  #include <fstream>  #include "node.h"  #include "myexceptions.h"    using namespace std;    class orthogonallinkedsparsematrix;  ostream& operator<< (ostream&, orthogonallinkedsparsematrix&);  istream& operator>> (istream&, orthogonallinkedsparsematrix&);    class orthogonallinkedsparsematrix{  public:      friend ostream& operator<<(ostream& out, orthogonallinkedsparsematrix& x);      friend istream& operator>>(istream& in, orthogonallinkedsparsematrix& x);      orthogonallinkedsparsematrix(){}      ~orthogonallinkedsparsematrix(){}      void transpose(orthogonallinkedsparsematrix &b);      void add(orthogonallinkedsparsematrix &a, orthogonallinkedsparsematrix &c);      void push_back(matrixnode *&mat_node);      void setdowns(matrixnode *&mat_node);  private:      matrixnode *hnode;      int numrows, numcols, numterms;      matrixnode *currentnode;      matrixnode *previousnode;      matrixnode *nextnode;  };   // code operator >> & <<, etc goes here, everything's commented out except operator >>    #endif 

edit: i'm including operator<< well:

    ostream& operator<<(ostream& out, orthogonallinkedsparsematrix& x){      if(x.numterms == 0){          out << "no non-zero terms" << endl;          return out;      }      out << x.numrows << x.numcols << x.numterms << endl;      (int = 0; < x.numterms; i++) {          out << x.currentnode->row << x.currentnode->col << x.currentnode->value << endl;      }      return out;  } 

i think issue currentnode. shouldn't need class variable, , instead should create new 1 each time read input stream. example,

istream& operator>>(istream& in, orthogonallinkedsparsematrix& x) {     in >> x.numrows >> x.numcols >> x.numterms;      int inrow, incol, invalue;     in >> inrow >> incol >> invalue;         // values input      // note: allocates new matrixnode on heap, , pushes pointer matrix.     x.push_back(new matrixnode(inrow, incol, invalue));      if(x.currentnode->col == 1){         x.hnode->down = x.currentnode;     }     if(x.currentnode->row == 1){         x.hnode->right = x.currentnode;     }      (int = 2; <= x.numterms; i++)      {         in >> inrow >> incol >> invalue;         // values input          // note: allocates new matrixnode on heap, , pushes pointer matrix.         x.push_back(new matrixnode(inrow, incol, invalue));     }      return in; } 

a few things note here:

  • each time push_back() called, new matrixnode pushed on. in implementation, same node added, , never initialized.
  • i assumed matrixnode has constructor takes 3 arguments. should easy add.

in general, managing pointers dangerous , prone memory leaks. in case, important call delete on each pointer when no longer need it. you'll want in destructor.

edit: looks hnode may being used invalid pointer. make sure assign/create matrixnode pointer before using it.


Comments

Popular posts from this blog

c# - How to set Z index when using WPF DrawingContext? -

razor - Is this a bug in WebMatrix PageData? -

visual c++ - Using relative values in array sorting ( asm ) -