2013-03-15 6 views
6

Ich versuche, die Boost-Graph-Bibliothek zu verwenden, und ich bekomme einen segfault, wenn ich versuche, boost :: edge() zu verwenden. Der vollständige Code ist verfügbar here, aber hier habe ich ein Minimalprogramm gemacht, die das gleiche Problem hat (ich mit „g ++ minimal.cpp“ bin kompilieren):boost :: edge verursacht 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; 
} 

Wenn ich Kommentar- der add_edge, remove_edge Linien ist, die segfault nicht auftreten und das Programm druckt die erwartete

G does not have an edge 1->3 

aber ist es eine Möglichkeit, solche Hacks zu vermeiden? Vielen Dank!

+0

Dies sieht viel wie ein Bug. Vielleicht möchten Sie es auf der [Boost-Devel Mailing List] (http://news.gmane.org/gmane.comp.lib.boost.devel) anzeigen, wenn Sie auf Stackoverflow keine angemessene Antwort erhalten. – Mankarse

Antwort

0

Offensichtlich fügt der Aufruf add_edge(1,3,G) Scheitelpunkte zum Diagramm bei Bedarf hinzu. Ihr erster Anruf ist in diesem Fall. Dann wird die Kante von Vertex 1 zu Vertex 3 hinzugefügt. Beachten Sie, dass nach diesem Aufruf die Anzahl der Vertices 4 ist, da die Vertices dann von 0 bis 3 indiziert werden nur hinzugefügt, aber die Anzahl der Scheitelpunkte bleibt unverändert.

Der Aufruf an edge(1,3,G) auf der anderen Seite fügt keine Ecke zum Graphen hinzu, der Boolean in der Rückkehr gibt dort an, wenn Scheitelpunkte 1 und 3 verbunden sind oder nicht. Es gibt eine Zugriffsverletzung, wenn Sie die add_edge entfernen, da die Scheitelpunkte bei Index 1 und 3 nicht vorhanden sind.

Sie können einfach die Grafik mit der gewünschten Anzahl von Eckpunkten initialisieren:

graph_t G(4); 
+0

Ich schätze die Aufmerksamkeit, aber das wurde vor 6 Monaten veröffentlicht. Ich arbeite nicht mehr aktiv an diesem Projekt. Es ist auch nicht klar aus dem obigen Beispiel, aber ich denke, dass es ein bisschen komplizierter sein muss, als Sie beschreiben. Ich glaube nicht, dass das Hinzufügen von add_edge (1,3, G) die Scheitelpunkte 0 und 4 hinzufügt. – bgschiller

+0

Tatsächlich habe ich die Anweisung mit dem Debugger verfolgt und war überrascht, "if (x> = num_vertices (g_)) g_ .m_vertices.resize (x + 1); " (Boost \ Graph \ Detail \ Adjazenzliste.hpp, Zeile 2186, Boost 1.50) – Raffi

+0

Wie auch immer, jede Frage dieser Art verdient eine Antwort. – Raffi