2013-02-10 3 views
0

Я пытаюсь отлаживать мою программу mergesort, которая, кажется, проблематична где-то внутри функции «merge», когда я пытаюсь использовать «push_back» для добавления значений из либо «left», или "right" to "mergedList". Ниже приведена отрывок из сеанса отладки gdb (с последующим моим полным программным кодом ниже)push_back не добавляя числа в вектор C++

Это происходит при первом вызове слияния; Мне удалось получить доступ к значениям «vector left», используя «print left [0]», и я получил ожидаемое значение (все числа в векторе «слева» находятся между 1-50000), но после выполнения строки код, когда i = 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

Попробуйте проверить, успешно ли вы открыли файл. –

+1

Используйте отладчик ... –

+1

Можете ли вы проверить, что ничего не было добавлено в 'объединенныйList' перед добавлением' left [0] '? То есть, есть ли вероятность, что 'right [j]> left [i]' в первой итерации? – chrisaycock

ответ

1

Этот код не хватает проверки ошибок, но это должно работать. Я думаю, что эта логика должна работать нормально. Вы пробовали отлаживать этот код, поскольку он не создавал сортировку. В конце, когда вы сортируете элементы, вы не печатаете отсортированные элементы, а те, которые вы читаете.

Поскольку ваш сеанс gdb имеет ненулевые значения для указателей в векторе i.e. _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