2012-08-17 77 views
2

找到二維矢量的總和有些麻煩。這看起來好嗎?查找二維矢量的總和

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 – 2012-08-17 02:07:54

+1

矩陣的所有元素都是正的嗎? – dasblinkenlight 2012-08-17 02:08:14

+0

嘿,不是所有的值都是正值,但是,我正在使用的算法中的for循環。 @dasblinkenlight – Phorce 2012-08-17 02:38:38

回答

1

代碼看起來是抽象的正確,但你可能會溢出theSum。你可以嘗試使theSum類型double看看你能得到什麼價值來幫助理清適合它的整體類型。

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

當你觀察返回的值,你可以看它是否會適合在int,或者如果你需要使用一個更廣泛的longlong long類型。

如果矩陣中的所有值都是正數,則應考慮使用其中一個無符號整數類型。這會使您允許的值的範圍加倍。

+2

爲什麼使用double - 不會長或長long會更好(或者它們的無符號等價) – 2012-08-17 02:15:04

+1

@AdrianCornish:它只取決於有多少溢出,以及有多大的東西被累加起來。 double是第一遍,如果可能的話,稍後用適當的整數類型替換。 – jxh 2012-08-17 02:16:23

+0

同意 - 爲此目的,它會沒事 - 我有雙打和漂浮在噩夢中,因爲精確度和日常工作中的==比較,所以我討厭他們;-) – 2012-08-17 02:21:08

0

我認爲這可能是int溢出問題。爲了確保,你可以在內部循環完成後插入一個條件來查看你的結果是否超出int範圍。

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

更好的方法來測試,如果你超過INT界限內循環結束後,打印出結果並注意結果。

。如果是這樣,只需使用更大的數據類型。

+0

這不符合您的想法。 'sizeof(int)'以字節爲單位返回'int'類型的大小。 – Blastfurnace 2012-08-17 04:45:16

+0

此外,即使'sizeof'做了你所假設的,測試也不會通過,因爲在超過最大可能值時,它會變成負值。 – jogojapan 2012-08-17 05:01:28

+1

@Blastfurnace你是對的,我的意思是它確實超過了int的邊界。 – 2012-08-17 11:41:16

1

就像Mokhtar Ashour說的那樣,可能是變量theSum溢出。嘗試使unsigned如果沒有數字是負數,或將其類型從int(即32位)更改爲long long(即64位)。

2

顯然,問題的INT超過其邊界(像其他人說)

對於簽名的數據類型時溢出,併爲無符號的數據類型從零溢出後重新開始變得消極。

如果您想實際檢測到溢出,可以粘貼這些行而不是附加行。

if(theSum > int(theSum + theBlocks[i][j])) 
    //print error message, throw exception, break, ... 
    break; 
else 
    theSum += theBlocks[i][j]; 

更多通用的解決方案有更多的數據類型,比除了更多的操作工作,檢查:How to detect integer overflow?

一個解決辦法是使用unsigned long long如果超過其邊界也一樣,你需要使用第三大型圖書館。

+1

有符號整數溢出的行爲未定義。 – jxh 2013-11-12 14:55:52