比较(int)double和(int)int时的异常

时间:2011-05-16 04:54:40

标签: c++ exception if-statement double int

嘿所以我正在使用pdCurses lib和stringStream来计算并制作一个代表时钟的5个字符的长字符串。它显示为00:00,0:00,00:00或0.000。但是当运行我的函数时,我会在这个部分得到一个例外:

if((int)time >= 10)
{
    if((int)time >= 60)
    {
        if((int)time >= 600)
        {

例外情况还指出存在访问冲突:

/* verify block type */
            _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

为什么这会像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 个答案:

答案 0 :(得分:1)

这是一个内存系统断言,它通常是在堆已经损坏时通过分配内存来触发的。触发器可能是这样的:

time_s.insert(0, min); 

然而,问题出在其他地方 - 在某些地方,你要覆盖你不应该的内存。

答案 1 :(得分:1)

这里还没有足够的内容,但我的猜测是断言是来自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());} 

答案 2 :(得分:0)

我认为你误解了抛出异常的原因。 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 {

每行一个语句,该异常将更加详细地告诉您哪个语句导致了问题。