Исключение при сравнении (int) double и (int) int - PullRequest
0 голосов
/ 16 мая 2011

Привет, поэтому я использую lib pdCurses и stringStream, чтобы вычислить и создать строку длиной 5 символов, которая представляет часы.Это показывает как 00:00, 0:00, 00.00 или 0.000.Однако, когда я запускаю свою функцию, я получаю исключение:что-то простое, как заявление if?и как я могу это исправить? Спасибо за любую помощь!=) Также вот моя функция:

////////////////////////////////////////////    Refresh     ///////////////////////////
void Refresh()
{
      for(int r = 0;r<nrows;r++)
      {
          move(r,0);
          instr((char*)_contents[r].c_str());
      }   // make sure this works later

      // Insert the current time;
      enum{ time_loc_y= 24, time_loc_x= 10 };
      long float time = myStopwatch.ElapsedTime();
      string time_s= "     "; 
      string min;  ss << (int)time%60; ss >> min;
      string sec;  ss << (int)time/60; ss >> sec;

      if((int)time >= 10)
      {
          if((int)time >= 60)
          {
              if((int)time >= 600)
              {
                  time_s.insert(0, min); // 00:00
                  time_s.insert(time_s.begin()+2, ':');
                  time_s.insert(4, sec);
              }
              else
              {
                  time_s.insert(1, min); //  0:00
                  time_s.insert(time_s.begin()+2, ':');
                  time_s.insert(4, sec);
              }
          }
          else
          {
              ss.precision(2); ss << time; //  00.00
              ss >> time_s;
          }
      }
      else
      {
          ss.precision(3);
          ss << time; //  0.000
          ss >> time_s;
      }
      mvinstr(time_loc_y, time_loc_x, (char*)time_s.c_str());
      refresh();
 }; // end of function

Ответы [ 3 ]

1 голос
/ 16 мая 2011

Здесь на самом деле недостаточно, но я предполагаю, что утверждение происходит из вызова time_s.insert(0, min), который находится в строке вместе с if((int)time >= 600) - строка выполняет некоторое перераспределение и куча была повреждена ( может быть из-за того, что происходит в цикле в верхней части функции, но, может быть, где-то еще целиком).

Если вы запустите это в отладчике и поймаете утверждение, как будет выглядеть стек вызовов?

Что происходит в:

for(int r = 0;r<nrows;r++){ move(r,0); 
                                instr((char*)_contents[r].c_str());} 
1 голос
/ 16 мая 2011

Это утверждение системы памяти, обычно оно вызывается выделением памяти, когда куча уже повреждена. Вероятно, триггер был такой:

time_s.insert(0, min); 

Однако проблема в другом - где-то, где вы перезаписываете память, которую не должны делать.

0 голосов
/ 16 мая 2011

Я думаю, вы ошибаетесь по поводу того, что выдает исключение. Где определяется ss?

Примечание: если вы переформатируете свой код в более канонический стиль, например

if((int)time >= 10){    
    if((int)time >= 60){
       if((int)time >= 600){   
          time_s.insert(0, min);              // 00:00
          time_s.insert(time_s.begin()+2, ':');
          time_s.insert(4, sec);
       } else {

с одним оператором на строку, исключение скажет вам гораздо более точно, какой оператор вызвал проблему.

...