Визуализируйте пользовательский класс с плавающей точкой в отладчике
Я уже немного поковырялся в 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 ответа
Поскольку диапазон возможных показателей очень мал, добавьте справочную таблицу (только для отладки) double power10[256];
, Отладчик с радостью воспользуется этим. Единственный недостаток: отладка конструкторов глобальных объектов может произойти до инициализации массива, и в этом случае эти значения будут по-прежнему равны 0. Вам нужно будет вызвать функцию инициализатора самостоятельно, из Immediate Window, если это произойдет.
На слегка связанной ноте вы захотите выбрать либо 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,!])
}
Другой подход, который может работать
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]
раздел.