查找二维矢量的总和

问题描述:

找到二维矢量的总和有些麻烦。这看起来好吗?查找二维矢量的总和

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

代码看起来是抽象的正确,但你可能会溢出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

我认为这可能是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

就像Mokhtar Ashour说的那样,可能是变量theSum溢出。尝试使unsigned如果没有数字是负数,或将其类型从int(即32位)更改为long long(即64位)。

显然,问题的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