2012-08-17 3 views
2

2D 벡터의 합계를 찾는 데 약간의 문제가 있습니다. 이게 괜찮아 보이니? 2D 벡터 합계 찾기

int sumOfElements(vector<iniMatrix> &theBlocks) 
{ 
    int theSum = 0; 

    for(unsigned i=0; (i < theBlocks.size()); i++) 
    { 
    for(unsigned j=0; (j < theBlocks[i].size()); j++) 
    { 
     theSum +=theBlocks[i][j]; 
    } 
    } 

    return theSum; 
} 

그것은, 그러나, 그것은 양수를 반환해야 음수를 반환

..

희망의 사람이 코드는 추상적 인 의미에서 적절한 보이는 :

+4

'iniMatrix'란 무엇이며 결과가 부호있는 int에 맞을 것으로 예상합니까 –

+1

매트릭스의 모든 요소가 양수입니까? – dasblinkenlight

+0

안녕하세요, 모든 값이 긍정적 인 것은 아니지만, 알고리즘의 for 루프가 작동합니다. @dasblinkenlight – Phorce

답변

1

도움이 될 수 있습니다,하지만 당신은 할 수있다 넘치는 theSum. theSum 유형 double을 사용하여 적절한 정수 유형을 분류하는 데 도움이되는 값을 확인할 수 있습니다. 반환 된 값을 관찰 할 때 더 넓은 long 또는 long long 유형을 사용해야 할 경우가 또는 int에 맞게한다면

double sumOfElements(vector<iniMatrix> &theBlocks) 
{ 
    double theSum = 0; 
    /* ... */ 
    return theSum; 
} 

, 당신은 볼 수 있습니다.

행렬의 모든 값이 양수이면 부호없는 정수 유형 중 하나를 사용해야합니다. 허용되는 값의 범위가 두 배가됩니다.

+2

왜 double을 사용 하는가 - 길지도 길지도 않을 것입니다. (또는 그 부호없는 것과 똑같습니다.) –

+1

@AdrianCornish : 그것은 단지 오버플로가 얼마나되는지, 얼마나 많은 것들이 합산되고 있는지에 달려 있습니다. double은 가능한 한 나중에 적절한 정수 유형으로 대체되는 첫 번째 패스입니다. – jxh

+0

동의 - 괜찮을 것입니다 - 정확하고 까다 롭기 때문에 나에게는 두배의 숙제와 악몽이 떠오 릅니다. –

0

정수 오버플로 문제 일 수 있습니다. 결과가 int 범위를 초과하는지 확인하기 위해 내부 루프가 완료된 후 조건을 삽입 할 수 있습니다.

if(result>sizeof(int)) 
    cout<<"hitting boundaries"; 

int 경계를 초과하는지 테스트하는 더 좋은 방법은 내부 루프가 끝난 후 결과를 인쇄하고 결과를 확인하는 것입니다.

.if 그래서 더 큰 데이터 유형을 사용하십시오.

+0

이것은 생각하는대로하지 않습니다. 'sizeof (int)'는 int 형의 크기를 바이트 단위로 반환한다. – Blastfurnace

+0

또한, 'sizeof'가 가정 한 바를 수행하더라도, 가능한 최대 값을 초과 할 때가되면 음수가되기 때문에 테스트는 통과하지 못합니다. – jogojapan

+1

@Blastfurnace 당신 말이 맞아, 나는 그것이 경계를 넘어선다는 것을 의미했다. –

1

Mokhtar Ashour가 말했듯이 변수 theSum이 오버플로되었을 수 있습니다. 숫자가 음수가 아니면 unsigned으로 변경하거나 int (32 비트)에서 long long (64 비트)으로 유형을 변경하십시오.

2

문제는 (다른 사람이 말한 것처럼)가 INT는 오버 플로우 및 부호없는 데이터 유형에 대해 다시 오버 플로우 후 0에서 시작 때 마이너스가 서명 된 데이터 유형의

그것의 경계를 초과 분명하다.

실제 오버플로를 감지하려면 추가 줄 대신이 줄을 붙여 넣을 수 있습니다. unsigned long long를 사용하는 것 How to detect integer overflow?

솔루션을하고 너무 그 경계를 초과하는 경우, 당신은 세 번째 사용해야 :

더 많은 데이터 유형과 또한보다 더 많은 작업을 함께 작동하도록 더 일반적인 솔루션을
if(theSum > int(theSum + theBlocks[i][j])) 
    //print error message, throw exception, break, ... 
    break; 
else 
    theSum += theBlocks[i][j]; 

,이를 확인 큰 정수를위한 파티 라이브러리.

+1

부호있는 정수 오버 플로우의 동작은 정의되지 않습니다. – jxh