2017-09-10 3 views
1

이 seg fault가 계속 발생하지만 어디에서 왔는지 전혀 알지 못합니다. 죄송합니다. 아직 코딩을 처음 사용합니다.벡터에 결과를 저장하는 재귀 함수의 세그먼트 오류

#include <iostream> 
#include <vector> 

using namespace std; 

vector<int> map(vector<int> v, vector<int>::iterator i, vector<int> result) { //set i = v.begin() in main 
    if (i==v.end()) { 
     return result; 
    } else { 
     result.push_back((*i)*(*i)); 
     i++; 
     map(v,i,result); 
    } 
} 

int main() { 
    vector<int> v; 
    vector<int> result; 

    for (int i=0;i<20;i++) { 
     v.push_back(i); 
    } 

    vector<int>::iterator it=v.begin(); 

    result=map(v,it,result); 
} 

분명히 내 질문은 주로 코드이기 때문에 더 많은 단어를 추가해야합니다.

+0

어떤 선이 오류입니까? –

+2

값을 기준으로하지 않고 참조로 벡터를 전달하십시오. – PaulMcKenzie

답변

2

값을 기준으로 벡터를 전달하므로 변경 내용이 함수 호출간에 유지되지 않습니다.

이렇게하려면 벡터를 참조로 전달하십시오.

또한 else 케이스에서도 벡터를 반환해야합니다.

또한 v을 참조로 전달하십시오.이 경우 반복자는 v.end()을 확인하면 정상적으로 처리됩니다. 그렇지 않으면 모든 함수 호출에서 v의 다른 사본을 볼 것입니다.

함께 최선을 다하는, 당신이 얻을 :

vector<int> map(vector<int>& v, vector<int>::iterator i, vector<int>& result) { 
    if (i==v.end()) { 
     return result; 
    } else { 
     result.push_back((*i)*(*i)); 
     i++; 
     return map(v,i,result); 
    } 
} 
+0

@xaxxon이 업데이트되었습니다. 지금 어떻게 생각하십니까? 오, 나는 당신이 대답을 올린 것을보고, 잠시 후에 점검 할 것입니다. (만약 내가 그것을 좋아한다면 당신은 나의 upvote를 보게 될 것입니다). – gsamaras

0

당신이 많은 상황에서 재귀 함수에서 값을 반환하지 않는 때문에 문제가 거의 확실 대신

vector<int> map(vector<int> v, vector<int>::iterator i, vector<int> result) { //set i = v.begin() in main 
    if (i==v.end()) { 
     return result; 
    } else { 
     result.push_back((*i)*(*i)); 
     i++; 
     map(v,i,result); 
     /** NO RETURN VALUE HERE **/ 
    } 
} 

을은을 마지막 줄 수 :

return map(v,i,result); 

이상적으로는 값으로 벡터를 전달하지 않을 것입니다. 프로그램이 중단되지 않고 더 느리게 실행됩니다.

는 값에 의해 첫번째 파라미터 (std::vector)에 전달되기 때문에, 각 호출 map 원래 상이한 벡터를 이용되어

1

두 가지 문제가있다. 따라서 전달중인 반복자는 전달 된 벡터와 호환되지 않으므로 프로그램에서 정의되지 않은 동작을 보입니다.

이 문제를 해결하려면 std::vector을 값이 아닌 참조로 전달하십시오. 당신은 또한 함수 내에서 vector을 변경하지 않기 때문에, const 참조로 전달합니다

vector<int> map(const vector<int>& v, vector<int>::iterator i, vector<int> result) 

지금 반복자는 벡터가 아닌 임시 복사본에 전달 된 실제 벡터 반복된다.

두 번째 문제는 map 함수의 값을 반환하지 않는다는 것입니다. 값을 반환해야하는 함수에서 값을 반환하지 않으면 정의되지 않은 동작입니다.

(모든 컴파일러 경고를 피하기 위해)를 else 문을 제거, 문제를 해결하고, 함수에서 값을 반환하려면

vector<int> map(const vector<int>& v, vector<int>::iterator i, vector<int> result) 
{ 
    if (i == v.end()) 
     return result; 
    result.push_back((*i)*(*i)); 
    i++; 
    return map(v, i, result); 
} 
0

재귀 호출을 준수하지 않기 때문에 충돌 하나의 잠재적 인 원인이 될 것입니다 return 문에 의해 (또는 그 일부). 호출자가 반환 값에 액세스하면 결과는 정의되지 않은 동작입니다.

무시해도 인수는 값으로 전달됩니다.따라서 벡터에 대한 변경 사항은 발신자에게 표시되지 않습니다. 더 중요하게는 iv.end()이 동일한 컨테이너에서 얻은 반복자가 아니기 때문에 (imain()에있는 벡터의 반복자이며 v은 해당 벡터의 복사본이므로 테스트 i == v.end()에 정의되지 않은 동작 (충돌의 또 다른 잠재적 원인)이 있습니다. - 완전히 다른 일련의 반복자가 있음).

마지막으로 std::map은 표준 라이브러리의 템플릿 형식입니다. map()이라는 함수를 가지고 있는데, 특히 using namespace std이 실행될 때 컴파일러에 모호함을주지 않으면 프로그래머를 혼란스럽게 할 수 있습니다.

관련 문제