Визуализируйте пользовательский класс с плавающей точкой в ​​отладчике - PullRequest
3 голосов
/ 30 августа 2010

Я уже немного поковырялся в autoexp.dat, чтобы упростить проверку пользовательских строк и других простых классов в отладчике Visual Studio (с использованием vs2005).Я бы очень хотел увидеть значение (или приблизительное значение) нашего пользовательского класса с плавающей запятой.Внутренним представлением является четырехзначное число (int mantissa [4], 128bit на x86), которое будет делиться на 10 в степени нашего показателя.Так что в основном это выглядит так:

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

Следующая инструкция преобразует его в double, учитывая, что fp является объектом типа FloatingPoint:

(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 ]

2 голосов
/ 31 августа 2010

Другой подход, который может сработать, это

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].

2 голосов
/ 30 августа 2010

Поскольку диапазон возможных показателей очень мал, добавьте справочную таблицу (только для отладки) double power10[256];. Отладчик с радостью воспользуется этим. Единственный недостаток: отладка конструкторов глобальных объектов может произойти до инициализации массива, и в этом случае эти значения будут по-прежнему равны 0. Если это произойдет, вам придется вызывать функцию инициализатора самостоятельно из окна немедленного действия.

В заметке, имеющей незначительное отношение, вы можете выбрать signed char или unsigned 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,!])
}
...