2

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

4 に答える 4

2

コードは抽象的な意味では適切に見えますが、オーバーフローしている可能性がありますtheSumtheSum型を作成doubleして、使用する適切な整数型を整理するのに役立つ値を確認できます。

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

戻り値を観察すると、それが に収まるかどうか、またはより広いタイプまたはタイプintを使用する必要があるかどうかを確認できます。longlong long

行列のすべての値が正の場合は、符号なし整数型のいずれかを使用することを検討する必要があります。これにより、許容値の範囲が 2 倍になります。

于 2012-08-17T02:09:26.703 に答える
2

問題は明らかに int がその境界を超えていることです(他の人が言ったように)

符号付きデータ型の場合、オーバーフローすると負になり、符号なしデータ型の場合、オーバーフロー後に再びゼロから始まります。

実用的にオーバーフローを検出したい場合は、追加の行の代わりにこれらの行を貼り付けることができます。

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

加算よりも多くのデータ型とより多くの操作を処理するためのより一般的なソリューションについては、これを確認してください:整数オーバーフローを検出する方法?

ソリューションは使用されてunsigned long longおり、それが境界を超えている場合は、大きな整数にサードパーティのライブラリを使用する必要があります。

于 2013-10-08T08:17:42.087 に答える
1

Mokhtar Ashourが言うように、変数theSumがオーバーフローしている可能性があります。unsigned負の数がない場合は作成するか、タイプをint(32ビット)からlong long(64ビット)に変更してみてください。

于 2012-08-17T05:21:49.887 に答える
0

intオーバーフローの問題である可能性があると思います。確実にするために、内側のループが終了した後に条件を挿入して、結果が int の範囲を超えているかどうかを確認できます。

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

int 境界を超えているかどうかをテストするより良い方法は、内側のループが終了した後に結果を出力し、結果を確認することです。

.その場合は、より大きなデータ型を使用してください。

于 2012-08-17T04:12:42.703 に答える