2013-11-02 71 views
-2

非常感謝您的評論,我在這裏是新手,不熟悉協議。這是我完整的例子。這裏就是我的頂點構造函數 裝載頂點[0] = XXX 在頂點構造函數 裝載頂點[1] = XXX 在頂點構造函數 裝載在頂點構造函數頂點[2] = XXX 得到執行基本指針/參考問題

加載頂點[3] = XXX 在頂點構造函數 加載頂點[4] = XXX 在頂點構造函數 加載頂點[5] = XXX 在頂點構造函數 加載頂點[0] = XXX calculateCosts 得到頂點命名xxx 移動頂點n艾湄XXX 做 分段故障

#include <iostream> 
#include <vector> 
#include <cassert> 
#include <limits> 
#include <initializer_list> 
#include <iterator> 

// required compile option g++ homeWork2.cpp -std=c++0x 

using namespace std; 

const int infinity = numeric_limits<int>::infinity(); 
//const vertex* nullPtr = 0; 

class vertex 
{ 
public: 
    string name; 
    vertex(string name = "undefined") 
    { 
     cout << "in vertex ctor " << endl; 
     name = "AAAAAA"; 
     value = infinity; 
     prev_vertex = NULL; 
    } 
    void set_value(int& value) 
    { 
     assert(value > 0); 
     value = value; 
    } 
    int get_value() 
    { 
     return value; 
    } 
    void set_prev_vertex(vertex& prev_vertex) 
    { 
     prev_vertex = prev_vertex; 
    } 
    vertex* get_prev_vertex() 
    { 
     return prev_vertex; 
    } 

private: 
    int value; 
    vertex * prev_vertex; 
}; 


class graph 
{ 
public: 
    graph(int graphSize = 50) 
    { 
     for (int i = 0; i < graphSize; ++i) 
     { 
      vertex* pV = new vertex("vertex name"); 
      pV->name = "xxx"; 
      cout << "loading vertex[ " << i << "] = " << pV->name << endl; 
      vertices.push_back(pV); 
     } 
    } 

// vector<vertex> get_neighbors(int i); 

    void push_Vertex(unsigned position, vertex* v); 
    void remove_Vertex(unsigned position); 
    vertex* get_Vertex(unsigned position); 
    int size(); 
    vector<vertex*> get_neighbors(int i); 

    ~graph() 
    { 
     while (vertices.size() > 0) 
     { 
//   cout << "removing vertices[ " << vertices.size() << "] = " << vertices.back() << endl; 
      delete vertices.back(); 
      vertices.pop_back(); 
     } 
    } 

private: 
    int graph_count; 
    vector<vertex*> vertices; 
}; 

void graph::push_Vertex(unsigned position, vertex* v) 
{ 
//  cout << "copying vertex named " << *v->name << endl; 
//  assert(v!=NULL); 
     vertices[position] = v; 
//  vertices.push_back(v); 
} 
void graph::remove_Vertex(unsigned position) 
{ 
    vertices.erase(vertices.begin()+position); 
} 
vertex* graph::get_Vertex(unsigned position) 
{ 
// vector<int>::iterator iter = vertices.begin()+=position; 
    vertex* pV = vertices.at(position); 
    cout << "got vertex named " << pV->name << endl; 
    return pV; 
} 

vector<vertex*> graph::get_neighbors(int i) 
{ 
    vector<vertex*> vertices; 
    /* load the it neighbors*/ 
    return vertices; 
} 

int graph::size() 
{ 
    return vertices.size(); 
} 

void moveVertex(graph& fromSet, graph& toSet, int position, int value) 
{ 
    vertex* v = fromSet.get_Vertex(position); 
    cout << "moving vertex named " << v->name << endl; 
    toSet.push_Vertex(0, v); 

} 

void calculateCosts(graph& unvisitedSet, graph& visitedSet) 
{ 
    moveVertex(unvisitedSet, visitedSet, 0, 0); 
    for (int i =0; i < unvisitedSet.size(); ++i) { 
// do the algo process ...   
    } 
} 

// 
int main() 
{ 

// adjacency_list adjList = adjacency_list(6); 
// cost_list costList = cost_list(6); 
    graph visitedSet = graph(6); 
    graph unvisitedSet = graph(1); 
    cout << "calculateCosts" << endl; 
    calculateCosts(visitedSet, unvisitedSet); 

    cout << "done" << endl; 

    return 0; 
} 
+0

請發表一篇http://sscce.org/ – d33tah

回答

2
 vertex* v = new vertex("vertex nbr "+i); 

在C++中,你不能在const char*int使用operator+。必須以其他方式構建一個字符串。我很驚訝編譯器沒有寫出警告,更不用說停在那裏。

編輯:我現在看到行「calculateCosts移動頂點命名完成分割錯誤」。這是非常不起眼的,我第一次沒有注意到它,但現在我看到它是程序的輸出。看起來,代碼導致分段錯誤在一個析構函數中。當段故障發生時,您的調試器是否具有暫停執行的功能?你可以打開嗎?你可以一步一步調試代碼,包括析構函數中的代碼嗎?如果你一步一步調試會發生什麼?

非常重要:vertex構造函數和析構函數是什麼樣的?

這篇文章應該提供一個答案,但我給你更多的問題,而不是。那是因爲你自己的問題缺乏相關信息。你給了一些代碼,這很好,但我無法編譯該代碼來重現錯誤。努力減少您的示例代碼,儘可能減少重現錯誤的次數。這可能需要很長時間,你可能很自然地發現問題。那將是完美的結果。

+0

謝謝。我修復了它。但它與指針問題沒有任何關係,我相信 – user2947811

+0

@ user2947811很難看出問題是什麼,因爲你的代碼確實顯示[short,self contained,correct example](http://sscce.org/) 。你甚至不會發布錯誤消息,也不會在代碼中發生什麼。我們不介意讀者。 – Dialecticus

+0

@ user2947811我編輯了「答案」。請注意標記爲「非常重要」的問題。 – Dialecticus