2013-02-10 4 views
0

""왼쪽의 벡터 중 하나에서 값을 추가하기 위해 "push_back"을 사용하려고하면 "병합"함수의 어딘가에서 문제가되는 것처럼 보이는 mergesort 프로그램을 디버그하려고합니다. 또는 "mergedList"에 "right"를 입력하십시오. 다음은 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

'left [0]'을 추가하기 전에'mergedList'에 아무 것도 추가되지 않았 음을 확인할 수 있습니까? 즉, 첫 번째 반복에서 '오른쪽'[j]가 떠났을 가능성이 있습니까? – chrisaycock

답변

1

이 코드 검사 오류를 부족하지만 여전히 작동합니다. 나는이 논리가 잘 작동해야한다고 생각한다. 정렬 된 출력을 생성하지 않으므로이 코드의 디버깅을 시도 했습니까? 마지막에 요소를 정렬 할 때 정렬 된 요소를 인쇄하지 않고 읽은 요소 만 인쇄합니다.

gdb 세션에 벡터의 포인터에 대해 null이 아닌 값 (예 : _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