Problem in using the Graph object in different function

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Man4ish
    New Member
    • Mar 2008
    • 151

    Problem in using the Graph object in different function

    I am creating a graph using boost library, I am making the network using create_Network function()
    i am adding the vertices to this graph by creating the object g of class Graph.
    I am trying to use this object g in the another function get_neighbours( )
    but it is not giving any result.Should I make it global or should use constructor so that values stored in the graph(vertices) object(g), can be used in any function.

    #include <boost/config.hpp>
    #include <iostream>
    #include <vector>
    #include <utility>
    #include <string>
    #include <boost/graph/adjacency_list. hpp>
    #include <boost/graph/graph_utility.h pp>
    #include <boost/property_map.hp p>
    #include "ed.h"
    #include "ve.h"
    using namespace boost;
    using namespace std;

    class Molecule
    {
    typedef adjacency_list< boost::vecS, boost::listS, boost::undirect edS, ve::VertexPrope rties, ed::EdgePropert ies> Graph;
    map<int,string> m;

    public:
    void set_molecule_pr operty(vector<s tring>& s4)
    {
    for (unsigned int i = 1; i <= s4.size(); i++)
    {
    m[i]=s4[i-1];
    }
    }



    void create_chemical _Network(vector <int> s1,vector<int> s2,vector<int> s3)
    {
    const int V = m.size()+1;
    Graph g(V);
    for (int i = 0; i <V ; i++)
    {
    if(s3[i]==1){
    add_edge(vertex (s1[i], g), vertex(s2[i], g), ed::EdgePropert ies("single bond"), g);
    }
    if(s3[i]==2){
    add_edge(vertex (s1[i], g), vertex(s2[i], g), ed::EdgePropert ies("double bond"), g);
    }
    if(s3[i]==3){
    add_edge(vertex (s1[i], g), vertex(s2[i], g), ed::EdgePropert ies("triple_bon d"), g);
    }
    }
    }

    void get_neighbours( )
    {
    //Graph g(m.size()+1);
    Graph g;
    property_map<Gr aph, std::size_t ve::VertexPrope rties::*>::type
    id = get(&ve::Vertex Properties::ind ex, g);
    property_map<Gr aph, std::string ed::EdgePropert ies::*>::type
    name = get(&ed::EdgePr operties::name, g);
    boost::graph_tr aits<Graph>::ve rtex_iterator vi, viend;
    int vnum = 0;
    for (boost::tie(vi, viend) = vertices(g); vi != viend; ++vi)
    id[*vi] = vnum++;
    graph_traits<Gr aph>::vertex_it erator i, end;
    graph_traits<Gr aph>::out_edge_ iterator ei, edge_end;
    for (boost::tie(i,e nd) = vertices(g); i != end; ++i)
    {
    if(id[*i]!=0)
    {
    cout << id[*i]<<"("<<m[id[*i]]<<")" << " ";
    for (boost::tie(ei, edge_end) = out_edges(*i, g); ei != edge_end; ++ei)
    cout << " --" << name[*ei] << "--> " << m[id[target(*ei, g)]] << " ";
    cout << endl;
    }
    }
    print_edges(g, id);
    cout<<endl;
    print_vertices( g,id);
    }
    };

    int main(int,char* [])
    {
    using namespace boost;
    Molecule mol;
    int s11[]={1,1,2,2,3,3,4 ,4,5,5,6,6,6,7, 7,7,8,8,8,8,9,9 ,10,10,11,11,12 ,12,13,14,17,19 ,19,19,20,20,20 ,21,21,21};
    int s12[]={13,19,14,20,1 5,21,16,18,17,1 8,16,27,28,18,3 8,39,9,10,22,23 ,11,12,16,17,14 ,24,13,25,15,15 ,26,29,30,31,32 ,33,34,35,36,37 };
    int s13[]={1,1,1,1,1,1,2 ,1,1,2,1,1,1,1, 1,1,1,1,1,1,2,1 ,1,2,1,1,2,1,1, 2,1,1,1,1,1,1,1 ,1,1,1};
    string s14[]={"O","O","O"," N","N","N","N", "C","C","C","C" ,"C","C","C","C ","C","C","C"," C","C","C","H", "H","H","H","H" ,"H","H","H","H ","H","H","H"," H","H","H","H", "H","H"};
    vector <string> s4;
    vector <int> s1,s2,s3;

    for (unsigned int i = 0; i < sizeof(s11)/sizeof(string); i++)
    {
    s1.push_back(s1 1[i]);
    s2.push_back(s1 2[i]);
    s3.push_back(s1 3[i]);
    }


    for (unsigned int i = 0; i < sizeof(s14)/sizeof(string); i++)
    {
    s4.push_back(s1 4[i]);
    }
    mol.set_molecul e_property(s4);
    mol.create_chem ical_Network(s1 ,s2,s3);
    mol.get_neighbo urs();
    return 0;
    }

    Please Help me out of this pblm.I will be really thankful to you.
  • weaknessforcats
    Recognized Expert Expert
    • Mar 2007
    • 9214

    #2
    Your Graph objects are local to the funciton. Local variables are destroyed when the function ends.

    The Graph object g in get_neighbours( ) is not the one created in create_chemical _Network().

    You need to create your Graph object on the heap and then pass a pointer to it to your various functions.

    Also, get_neighbours( ) has no arguments and returns a void. That means your entire application is inside this thing, in which case having the funciton at all is pointless. Or you are using global variables which are a disaster waiting to happen.

    If you are using global variables, the you should read the Case Against Global Variables in the C/C++ HowTos forum.

    Comment

    Working...