2

ベクトルをfloat値で埋めるこのプログラムがあり、float値を合計したときに各ベクトル(bin)の合計が1.0未満になるようにします。デバッグを通じて、ベクトルの値をfloatに追加しようとすると、プログラムが停止していることを発見しました。その理由は、forループが、ベクターに存在する要素よりも多く実行されているためです。サイズの値を確認するためにカウトを挿入しましたが、非常に多くの数(9500万もの)を取得しています

//Bin packing algorithm
//Takes float values which are <1 and packs them into bins.

#include <iostream>
#include <vector>
#include <list>
#include <cassert>

using namespace std;
typedef unsigned int uint;

bool gt( float a, float b )
{
   return b < a;
}

int main()
{
   list< float > S; 
   while( ! cin.eof() )
   {
      float value;
      if( cin >> value && ! cin.eof() )
      {
      assert( value > 0.0 && value <= 1.0 );
         S.push_back( value );
      }
   }

   uint n = S.size();
   uint operations = 0;

   vector< vector< float > > bins;
   S.sort( gt );

   float currentitem;
   float binsum; 

   uint totalbins = 0; 
   uint currentbin; 

   vector<float> tempbin;
   while(S.size() != 0)
   {
      currentitem = S.front();
      S.pop_front();
      currentbin = 0;
      while(currentitem != 0 && totalbins > currentbin)
      {
         currentbin++;
         bintotal = 0;
         for(uint i=0; i < bins[currentbin].size(); i++) 
         {
            cout << "i=" << i <<" bins[currentbin].size()=" << bins[currentbin].size() <<  endl;
            binsum += bins[currentbin][i]; //THIS IS WHERE THE DEBUGGER POINTS. bins[currentbin].size() is producing the 95 million garbage value.
         }
         if((binsum + currentitem) <= 1)
         {
            currentitem = 0;
            bins[currentbin].push_back(currentitem);
         }
      }
      if(currentitem != 0)
      {
         totalbins++;
         tempbin.push_back(currentitem);
         bins.push_back(tempbin);
         tempbin.clear();
      }
   }
4

1 に答える 1

3

bins[currentbin]変数がすでにインクリメントされているため、forループアクセス無効なビンで。ループの後にcurrentbinする必要があります。currentbin++for

于 2012-12-07T05:53:02.783 に答える