在调试器中可视化自定义浮点类

时间:2010-08-30 08:46:04

标签: c++ visual-studio-2005

我已经在autoexp.dat中做了一些调整,以便在Visual Studio调试器中轻松检查自定义字符串和其他简单类(使用vs2005)。我真的很想直接看到我们的自定义浮点类的值(或近似值)。内部表示是一个四元整数(int尾数[4],x86上的128位),将除以10到指数的幂。所以它基本上是这样的:

class FloatingPoint
{
   private:
      char exponent;
      int mantissa[4]
};

如果fp是FloatingPoint类型的对象:

,以下语句会将其转换为double
(mantissa[0] + 
   * ((double)mantissa[1] * 32 * 2) 
   * ((double)mantissa[2] * 64 * 2) 
   * ((double)mantissa[3] * 96 * 2))
   /  std::pow(10, fp.exponent)

是否有可能以某种方式使用此计算使Visual Studio调试器显示类型为FloatingPoint的对象?对pow的调用是一个额外的问题,因为这个函数没有外部链接而且调试器无法调用...也许有办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

由于可能的指数范围很小,因此添加(仅限调试)查找表double power10[256];。调试器很乐意使用它。唯一的缺点:全局对象的调试构造函数可能在数组初始化之前发生,在这种情况下,这些值仍然是0.如果发生这种情况,您将需要自己从立即窗口调用初始化函数。

在略微相关的说明中,您需要为指数选择signed charunsigned char。 (可能是signed,否则没有必要浮动)。简单char有一个实现定义的符号,这里符号非常相关。

快速尝试(未经测试):

FloatingPoint {
  preview (
    #([($c.mantissa[0]  + $c.mantissa[1] * 64.0 + $c.mantissa[2] * 128.0 + $c.mantissa[3] * 192.0) / power10[$c.exponent], f])
  )
  stringview (
    #([($c.mantissa[0]  + $c.mantissa[1] * 64.0 + $c.mantissa[2] * 128.0 + $c.mantissa[3] * 192.0) / power10[$c.exponent], f])
  )
  children([$c,!])
}

答案 1 :(得分:2)

另一种可行的方法是

const char* FloatingPoint::ToString () const
{
  static char buf[64];
  double d = (mantissa[0] + 
   * ((double)mantissa[1] * 32 * 2) 
   * ((double)mantissa[2] * 64 * 2) 
   * ((double)mantissa[3] * 96 * 2))
   /  std::pow(10, fp.exponent);
  sprintf(buf, "%f", d);
  return buf;
}

允许Floatingpoint =<ToString()>部分中的[AutoExpand]