2013-02-10 94 views
0

我试图调试我的mergesort程序,这似乎是有问题的地方内的“合并”函数,当我尝试使用“push_back”从向量添加值“左”或“右”到“mergedList”。以下是gdb调试会话摘录(后面是我的完整程序代码)push_back不向向量C++添加数字

这发生在第一次调用合并;我可以使用“print left [0]”访问“vector left”的值,并且我得到了一个我期待的值(向量“left”中的所有数字都在1-50000之间),但是在执行代码当我= 0:

“mergedList.push_back(left [i]);”然后使用调试器打印mergedList [0],看起来添加left [0]失败。

我误解了push_back?或矢量?对不起,如果我的问题不清楚 - 请让我知道我该如何改进它!


GDB调试会话:


(gdb) print left[0] 
$1 = (int &) @0x100104760: 14108 
(gdb) print mergedList[0] 
$2 = (int &) @0x7fff5fbfdbf0: 1066800 
(gdb) 
(gdb) info locals 
t = 0 
i = 0 
mergedList = { 
    <std::_Vector_base<int,std::allocator<int> >> = { 
    _M_impl = { 
     <std::allocator<int>> = { 
     <__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, 
     members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl: 
     _M_start = 0x7fff5fbfdbf0, 
     _M_finish = 0x7fff5fbfdc68, 
     _M_end_of_storage = 0x7fff5fbfdb90 
    } 
    }, <No data fields>} 
j = 0 
sizeOfLeft = 1 
sizeOfRight = 1 
next = 1 
(gdb) 
-uuu:**-F1 *gud-p1*  Bot L28 (Debugger:run)-------------------------------------- 


    ------------------------------------------------------------------------------------------------------------------ 
    while (iss >> n) 
    { 
      v.push_back(n); 
    } 

    } 

    return v; 
} 

vector<int> merge(vector<int> left, vector<int> right){ 

    int i = 0; 
    int j = 0; 
    int sizeOfLeft = left.size(); 
    int sizeOfRight = right.size(); 
    vector<int> mergedList; 

    while (i < sizeOfLeft || j < sizeOfRight){ 
    if (i < sizeOfLeft && j < sizeOfRight){ 
      if (left[i] < right[j]) { 
     mergedList.push_back(left[i]); 
=>   i++; 
      }else{ 
       mergedList.push_back(right[j]); 
     j++; 
-uu-:---F1 main.cpp  21% L47 (C++/l Abbrev)-------------------------------------------------------------------------------------------------------------------------------------------------------- 


    #COMPLETE MERGESORT PROGRAM 



    #include <iostream> 
    #include <fstream> 
    #include <sstream> 
    #include <string> 
    #include <vector> 

    using namespace std; 

vector<int> getNums(){ 


    ifstream infile("/Users/christinedeist/Documents/Algorithms/Practice/TestProject/IntegerArray.txt"); 
    string line; 
    vector<int> v; 

    while (getline(infile, line)) 
    { 
     istringstream iss(line); 
     int n; 

     while (iss >> n) 
     { 
      v.push_back(n); 
     } 

    } 

    return v; 
} 

vector<int> merge(vector<int> left, vector<int> right){ 

    int i = 0; 
    int j = 0; 
    int sizeOfLeft = left.size(); 
    int sizeOfRight = right.size(); 
    vector<int> mergedList; 

    while (i < sizeOfLeft || j < sizeOfRight){ 
     if (i < sizeOfLeft && j < sizeOfRight){ 
      if (left[i] < right[j]) { 
       mergedList.push_back(left[i]); 
       i++; 
      }else{ 
       mergedList.push_back(right[j]); 
       j++; 
      } 

     }else if (i < sizeOfLeft){ 
      mergedList.push_back(left[i]); 
      i++; 
     }else if (j < sizeOfRight){ 
      mergedList.push_back(right[j]); 
      j++; 
     } 
    } 


    return mergedList; 

} 

vector<int> sortVector(vector<int> nums){ 

    int sizeOfNums = nums.size(); 

    if (sizeOfNums == 1){ 
     return nums; 
    } 
    vector<int> left; 
    vector<int> right; 
    int midpoint = sizeOfNums/2; 
    for (int i = 0; i < midpoint; i++){ 
     left.push_back(nums[i]); 

    } 
    for (int j = midpoint; j < sizeOfNums; j++){ 
     right.push_back(nums[j]); 
    } 
    left = sortVector(left); 
    right = sortVector(right); 
    return merge(left, right); 

} 

int main (int argc, char *argv[]) { 

    vector<int> nums = getNums(); 
    vector<int> sorted = sortVector(nums); 

    for(int i = 0; i < nums.size(); i++){ 
     cout << nums[i] <<endl; 

    } 

    return 0; 
} 
+2

尝试检查您是否成功打开文件。 – 2013-02-10 20:46:01

+1

使用调试器... – 2013-02-10 20:46:36

+1

您可以在追加'left [0]'之前确认没有任何内容被添加到'mergedList'中?也就是说,在第一次迭代中,有没有可能'right [j]>离开[i]'? – chrisaycock 2013-02-10 20:47:32

回答

1

此代码缺少错误检查,但应该仍然可以工作。我认为这个逻辑应该可以正常工作。您是否尝试调试此代码,因为它没有生成已排序的输出。最后,当您对元素进行排序时,您不会打印排序元素,而是显示您阅读的元素。

因为您的gdb会话在向量中有指针的非空值,即_M_start = 0x7fff5fbfdbf0, _M_finish = 0x7fff5fbfdc68, _M_end_of_storage = 0x7fff5fbfdb90这有一些元素被推入向量中。因此,文件必须打开并成功读取。

+0

谢谢!我认为这个错误实际上是在我的代码中的其他地方,push_back本身似乎有效,我想我只是误解了如何在程序中的某些点读取数组中的值。我试图在一个新的帖子中找出问题:http://stackoverflow.com/questions/14819183/why-cant-i-access-value-in-a-vector-using-print-in-gdb-debugger – cdeist 2013-02-11 19:15:37