Boost logo

Boost Users :

From: Ramón Casero Cañas (yg-boost-users_at_[hidden])
Date: 2002-11-17 19:15:13


Hi, I'm working with GNU/Linux, Debian Sarge, libboost-graph1.28.0, gcc
version 2.95.4 20011002 (Debian prerelease).

I'm quite new to this, so I don't know if I'll be able to explain my
problem correctly. It seems to me as if when I declare a graph, it
writes on memory already used by another data structure. The parts of
the code that I consider relevant are (.hpp and .cpp merged)

-------------------
       |
       |
      \|/
-------------------
#include <utility> // for std::pair
#include <boost/graph/adjacency_list.hpp>/* for namespace boost
                                           * vertex_index_t
                                           * edge_weight_t
                                           * listS
                                           * undirectedS
                                           */

using namespace boost;

namespace boost {
   enum vertex_to_be_spanned_t { // used to mark vertices of W
     vertex_to_be_spanned
   };
   BOOST_INSTALL_PROPERTY(vertex, to_be_spanned);
}
namespace steiner {
   typedef std::pair<int,int> Edge; // type of edges

   /* Steiner Problem Graph:
    * - multigraph
    * - add_edge(), ... stability and speed, bad space overhead
    * - vertex indices, edge weights
    */
   typedef property <vertex_index_t, int,
                     property <vertex_to_be_spanned_t, bool> >
VertexProperty;
   typedef property <edge_weight_t, int> EdgeProperty;
   typedef adjacency_list <listS, listS, undirectedS,
                           VertexProperty, EdgeProperty > SteinerGraph;
}

namespace steiner {
#define EX_FORMAT "not a valid steiner problem file";
}
#include <iostream> // for std::cout
#include <fstream> // for std::ifstream

using namespace steiner;

namespace steiner {
   int readsteinerORfile(steiner::SteinerGraph& g, char *s);
}
namespace steiner {
   inline void skipspaces(std::ifstream& fp, char& c);
}
namespace steiner {
   inline int readchar2int(std::ifstream& fp, char& c);
}
/* int main(int argc, char *argv[])
  * --------------------------------
  * *argv[] (IN): file names array
  * --------------------------------
  * return n: n files were succesfully read, n > 0
  * return 0: no files could be read
  * return -1: unexpected error
  * --------------------------------
  * read steiner problem from files
  */
int main(int argc, char *argv[]) {
   ...
       SteinerGraph g;
       nf = steiner::readsteinerORfile(g, argv[i]);
   ...
}

/* int readsteinerORfile(VertexListGraph& g, char *s)
  * --------------------------------
  * g (OUT): graph read from file
  * *s (IN): file name
  * --------------------------------
  * return 1: file successfully read
  * return 0: file could not be read
  * return -1: unexpected error
  * --------------------------------
  * read steiner problem from one file
  */
namespace steiner {
   int readsteinerORfile(steiner::SteinerGraph& g, char *s) {
    ...
     int num_edg=0, num_ver=0, // number of edges, vertices
       num_verw=0; // number of non-steiner vertices
     char c; // file reader
     int i; // counter
     int x; // temp value
     int *weight_array=NULL; // edge weights read from file
     Edge *edge_array=NULL; // array of edges read from file
     int *w_array=NULL; // vertices of W
    ...
      weight_array = new int[num_edg];
       if (weight_array == NULL) throw (char *)EX_MEM;
       edge_array = new Edge[num_edg];
       if (edge_array == NULL) throw (char *)EX_MEM;
       w_array = new int[num_verw];
       if (w_array == NULL) throw (char *)EX_MEM;
    ...
*************** HERE *******************
       /* creation of graph object */
       g.clear();
       g = SteinerGraph(num_ver);

*************** HERE *******************
    ...
   }
}

-------------------
       |
       |
      \|/
-------------------

And what happens? If I print the contents of w_array[] at the first
"HERE", I get
Puf(W(0)=0 )!
Puf(W(1)=1 )!
Puf(W(2)=2 )!
Puf(W(3)=3 )!

but if I print them again at the second "HERE", I get
Puf(W(0)=8 )!
Puf(W(1)=1 )!
Puf(W(2)=2 )!
Puf(W(3)=-15 )!

Does anybody knows what could be happening? Thank you.

Regards,

Ramón Casero.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net