2013-07-24 15 views
2

我已經編寫了類似於下面的代碼。我得到分段錯誤錯誤。調試器顯示錯誤來自'some_order'。我檢查了一個特定示例的變量值。取n = 26:然後,Var = {0,...,25}這意味着傳遞給'some_order'的u和v必須在範圍內(0-25),但是我得到一些很大的值,例如7785654或-1549259(像這樣的)。我不明白爲什麼。 Segementation故障是不可避免的。基於矩陣引起的排序對矢量進行排序時的分段錯誤

//TNT: template numeric toolkit 
#include "tnt.h" 
//contains includes to all files in http://math.nist.gov/tnt/tnt_doxygen/files.html 
//all other necessary stl and standard c++ libaray includes are there  

class global_data{ 
public: 
    static TNT::Matrix<double>* Value_matrix; 

}; 
TNT::Matrix<double>* global_data::Value_matrix = NULL; 


bool some_order(const int& u ,const int& v) { 
     return (*global_Data::Value_matrix)[v][u] == 0.0; 
} 

void some_function(int n){ 
    std::vector<int> Var(n); 
    for(int i=0; i<n; i++){ 
     Var[i] = i; 
    } 
    std::sort(Var.begin(), Var.end(), some_order); 
} 

int main(){ 
    //assume we have n;  
    //nxn matrix, initialised with 0.0 
    global_data::Value_matrix = new TNT::Matrix<double>(n,n,0.0) ; 
    //global_data::Value_matrix is then filled with values 
    some_function(n); 
    delete[] global_data::Value_matrix 
} 
+0

你的排序函數應該返回兩個參數中的哪一個更大,並且它看起來什麼都不做。 – jcoder

+1

你的'some_function'沒有什麼可觀察的。它創建一個矢量並對其進行分類,然後將其丟棄。 – TemplateRex

+0

@jcoder:這是根據Value_matrix的值進行排序的不同類型 –

回答

5

這種類型的錯誤幾乎總是由於排序功能 不符合嚴格的弱序化的要求,標準所要求的 。您確定1)some_order(a, b) && some_order(b, c)意味着some_order(a, c),並且2) some_order(a, b)意味着!some_order(b, a)? (關手,它 不看艾克給我,但我真的不明白它 在做什麼。)

+0

+1在這個測試案例中,它總是返回「true」,這意味着所有元素都應該在所有其他元素之前。 –

+0

這可能是可能的原因。我會研究這個問題。 –

+0

@JoachimIsaksson更重要的是,這意味着'a

5

std::sort假定比較功能機型Strict Weak Ordering

  • 漫反射: some_order(u, u)返回false
  • 反對稱:some_order(u, v)意味着!some_order(v, u)(既可以是假的,在這種情況下uv是等同的)
  • 傳遞:some_order(u, v) == truesome_order(v, w) == true意味着some_order(u, w) == true

這將取決於你的global_Data矩陣是否您some_order()可以std::sort

- irreflexive: diagonal cannot have 0.0 on it 
- anti-symmetric: if an entry has 0.0 then the transpose element has no 0.0 
- transitive: if `global_Data[u, v]` and `global_Data[v, w]` have 0.0 then `global_Data[u, w]` also has that. 

使用先驗它似乎是一個非常強大的限制,可能會內容想要檢查它。

+0

你的第二個條件是錯誤的:'some_order(u,v)'暗示'!some_order(v,u)',但都可以是假的(並且'!some_order u,v)&&!some_order(v,u)'定義了一個等價關係)。 –

+0

std :: sort不會使用some_order(u,u)對不對?爲什麼在排序時將元素與iteself進行比較?僅僅是嚴格弱排序的定義的一部分 –

+0

@JamesKanze tnx,固定! – TemplateRex