2013-03-15 16 views
6

Sto provando ad usare la libreria del grafico boost, e sto ottenendo un segfault quando provo a usare boost :: edge(). Il codice completo è disponibile here, ma qui ho fatto un programma minimo che ha lo stesso problema (sto compilazione con "g ++ minimal.cpp"):boost :: edge che causa segfault

#include<stdio.h> 
#include<boost/graph/adjacency_list.hpp> 

using namespace boost; 
using namespace std; 

typedef adjacency_list<> graph_t; 
typedef graph_traits<graph_t>::edge_descriptor edge_descriptor; 

int main(){ 
    graph_t G; 
    //add_edge(1,3,G); 
    //remove_edge(1,3,G); 
    pair<edge_descriptor, bool> res = edge(1,3,G); 
    printf("G does %shave an edge 1->3\n", res.second ? "" : "not "); 
    return 0; 
} 

Se togliere il commento alla add_edge, linee remove_edge , il segfault non si verifica, e il programma stampa l'atteso

G does not have an edge 1->3 

, ma c'è un modo per evitare tale aggiustamenti? Grazie!

+0

Questo sembra un po 'come un insetto. Potresti voler farlo apparire sulla [Mailing list di Boost-Devel] (http://news.gmane.org/gmane.comp.lib.boost.devel) se non riesci a ottenere una risposta adeguata su Stackoverflow. – Mankarse

risposta

0

Apparentemente, la chiamata add_edge(1,3,G) aggiunge i vertici al grafico se necessario. La tua prima chiamata è in quel caso. Quindi aggiunge il bordo dal vertice 1 al vertice 3. Notare che dopo questa chiamata, il numero di vertici è 4, poiché i vertici vengono quindi indicizzati da 0 a 3.

La successiva chiamata a remove_edge(1,3,G) rimuove il bordo che era appena aggiunto, ma lascia invariato il numero di vertici.

La chiamata a edge(1,3,G) d'altra parte non aggiunge alcun vertice al grafico, il booleano nel ritorno è lì per indicare se i vertici 1 e 3 sono collegati o meno. Vi è una violazione di accesso se si rimuove lo add_edge perché i vertici di indice 1 e 3 non esistono.

Si può semplicemente inizializzare il grafico con il numero desiderato di vertici:

graph_t G(4); 
+0

Apprezzo l'attenzione, ma questo è stato pubblicato 6 mesi fa. Non sto più lavorando attivamente a questo progetto. Inoltre, non è chiaro nell'esempio sopra, ma penso che debba essere un po 'più complicato di quello che stai descrivendo. Non credo che chiamare add_edge (1,3, G) aggiunga i vertici 0 e 4. – bgschiller

+0

In realtà, ho tracciato l'istruzione con il debugger, e sono rimasto sorpreso nel trovare "if (x> = num_vertices (g_)) g_ .m_vertices.resize (x + 1); " (boost \ graph \ detail \ adjacency_list.hpp, riga 2186, boost 1.50) – Raffi

+0

In ogni caso, qualsiasi domanda di questo tipo merita una risposta. – Raffi

Problemi correlati