2010-05-19 4 views
1

다음은 코드 문제입니다.C++ 초보자 - 간단한 코드 블록 충돌, 이유를 알 수 없음

string Game::tradeRandomPieces(Player & player) 
{ 
    string hand = player.getHand(); 
    string piecesRemoved; 
    size_t index; 
    //Program crashes while calculating numberOfPiecesToTrade... 
    size_t numberOfPiecesToTrade = rand() % hand.size() + 1 
    for (; numberOfPiecesToTrade != 0; --numberOfPiecesToTrade) 
    { 
    index = rand() % hand.size(); 
    piecesRemoved += hand[index]; 
    hand.erase(index,1); 
    } 

    player.removePiecesFromHand(piecesRemoved); 
    player.fillHand(_deck); 

    return piecesRemoved; 
} 

나는이 코드가 매우 자명하다고 생각한다.

fillhandremovepiecesfromhand은 정상적으로 작동하므로 문제는 아닙니다. 정말 시간이 :(

감사 뭐가 잘못 얻을 수

OK, I 프로그램이 충돌합니다. 위의 소스 코드에 주석을 추가했습니다.

을 발견 편집
+2

어디에서 충돌이 발생합니까? 당신은 역 추적을 가지고 있습니까? –

+4

어떤 오류가 발생했는지, 어떤 행이 죽어가는 지 등 자세한 정보를 제공 할 수 있습니까? –

+3

'player.removePiecesFromHand (..)'및'player.fillhand (...)'를 주석 처리하면 충돌이 발생합니다. 그렇다면 어떤 라인을 꽤 빨리 줄일 수 있습니다. –

답변

0

중단 점을 for 루프에 붙여 놓으면 무슨 일이 일어나는지 더 잘 알 수 있습니다. for 루프가 무한히 진행되어 프로그램이 중단 될 것입니다.

브레이크 포인트를 치는 중에 반복기 변수를 확인하고 평범하지 않은 것을 볼 수 있는지 확인하십시오

+0

수표를 보내 주셔서 감사합니다. 문제가 무엇인지 공유해 주시면 다른 사람들이 귀하의 혜택을 누릴 수 있습니까? 발견? –

+0

실제로 이상하게 들렸습니다. 우선 printf를 사용하여 디버깅을 시작했는데, 실제 "디버그"기능을 사용했습니다. 제 질문에 표시된 것처럼 numberOfPiecesToTrade를 for 루프 선언에서 제거한 후에 충돌이 멈추었습니다. –

3

손이,이 동작 빈 경우 : for 루프의 초기화에서

rand() % hand.size() 

하는 modulu 수행을 시도한다 s를 0으로 나눈 값이다. 그것은 당신의 추락입니다.

나머지 방법을 진행하기 전에 손이 비어 있지 않은지 확인하는 테스트를 추가하십시오.

+0

이렇게하면 '이 프로그램이 응답을 멈췄습니다.' –

+1

부동 소수점 예외가 발생하며이 코드의 크래시 버그 일 것입니다. FPE가 발생할 때 Windows가 어떤 메시지를 표시하는지 전혀 모르겠습니다. 두 번째 오류가있을 수 있지만 표시되지 않습니다. 편집 : 또는 어떤 이유로 div-by-zero 결과가 음수가 아닌 충돌이 발생하면 루프가 무한하게됩니다. 그러나 나는 왜 그런 시스템이 FPE를 다루는 지 모르겠습니다. –

+0

예, div를 0으로 간주하고 이미 .empty() 테스트를 실시했습니다. 그러나 어쨌든 고마워. –

0

은 아마 당신은 일을 명확하게하기 위해

for (size_t numberOfPiecesToTrade = rand() % hand.size() + 1; numberOfPiecesToTrade > 0; --numberOfPiecesToTrade) 

를 사용하고 싶습니다.

편집 : 디버그 모드로 실행하는 경우 디버그하지 마십시오. :) 이 "응답하지 않음"메시지는 흔히 무한 루프로 인해 발생합니다.

Edit2 : 내가 맞는지 모르겠지만 numberOfPiecesToTrade의 초기 값이 1이면 numberOfPiecesToTrade! = 0 조건을 놓칠 수 있습니다. 나는 size_t에 익숙하지 않다.

+0

편집 : 어떻게해야할지 모르겠다. 내가 알기를, 나는 배워야 만한다. 편집 번호 2 : 아니오, 그렇지 않다 –

관련 문제