2013-03-15 27 views
6

Destek grafiği kitaplığını kullanmaya çalışıyorum ve boost :: edge() işlevini kullanmaya çalıştığımda segfault alıyorum. (I "g ++ minimal.cpp" ile derleme) tam kod kullanılabilir here, ama burada aynı sorunu var minimal programı yaptık:boost :: edge segfault neden oluyor

#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; 
} 

Ben add_edge, remove_edge hatları yorumsuz , segfault oluşmaz ve program beklenen

G does not have an edge 1->3 

basar ama böyle hackery önlemek için bir yol var? Teşekkürler!

+0

Bu bir hata çok benziyor. Stackoverflow üzerinde uygun bir yanıt alamıyorsanız, [Boost-Devel Postalama Listesi] 'ne (http://news.gmane.org/gmane.comp.lib.boost.devel) ulaşmak isteyebilirsiniz. – Mankarse

cevap

0

Görünüşe göre, add_edge(1,3,G) çağrısı, gerekirse grafiğe köşe noktaları ekler. İlk araman bu durumda. Daha sonra, köşe 1'den köşe 3'e kadar olan kenarı ekler. Bu çağrıdan sonra, köşe noktalarının sayısı 0'dan 3'e endekslendiğinden, köşelerin sayısının 4 olduğunu unutmayın.

Sonraki remove_edge(1,3,G) numaralı çağrı, söz konusu kenarı kaldırır. Sadece eklendi, ancak değişmeyen köşe sayısını bırakır.

edge(1,3,G) numaralı çağrı, grafiğe herhangi bir köşe eklemez, dönüşteki boole, 1 ve 3 numaralı köşelerin bağlanıp bağlanmadığını belirtir. Erişim ihlali var demektir, add_edge'u kaldırırsınız, çünkü 1 ve 3 numaralı dizinler mevcut değildir.

Sadece köşe istenilen sayı ile grafik başlatabilir:

graph_t G(4); 
+0

Dikkatini takdir ediyorum, ancak bu 6 ay önce yayınlandı. Artık bu proje üzerinde aktif olarak çalışmıyorum. Ayrıca, yukarıdaki örneklerden de net değil, ama açıklamakta olduğundan biraz daha karmaşık olması gerektiğini düşünüyorum. Add_edge (1,3, G) 'nin aramayı 0 ve 4. köşeleri ekleyeceğini sanmıyorum. – bgschiller

+0

Aslında, talimatı debugger ile takip ettim ve kendimi "if (x> = num_vertices (g_)) g_ .m_vertices.resize (x + 1); " (boost \ graph \ detail \ adjacency_list.hpp, 2186 numaralı satır, 1.50'ı artırın) – Raffi

+0

Her neyse, bu tür bir soru bir cevabı hak ediyor. – Raffi