2015-07-29 4 views
4

Вчера я обнаружил MSVC's "Natvis" tool, что позволяет вам настроить отладчик для представления ваших типов интеллектуальным способом. Я быстро приступил к преодолению моей математической библиотеки.Формат плавающей запятой Natvis

Вот как мои 3 * 3 матрицы выглядит класс (неинициализированные данные):

matrix 3x3

Gorgeous, верно? Мой день не пожалел.

Однако, теперь мы получаем несколько более сложный случай:

matrix 4x4

Как вы можете видеть, цифры не совпадают. Я понял, пути противные глиняный получить отрицательные числа для выравнивания с положительными числами, но мой метод не имеет никакого способа приближения к этому (вот моему основному контуру):

<Type ...> 
    <DisplayString>...</DisplayString> 
    <Expand ...> 
     <Synthetic ...> 
      <DisplayString ...>...</DisplayString> 
     </Synthetic> 
     ... 
    </Expand> 
</Type> 

Что происходит заключается в том, что количество цифр, напечатанных , варьируется от от номера до номера.

Поэтому мой вопрос: Могу ли я настроить Natvis для печати четко определенного количества цифр для отладки? Альтернативно, возможно, у вас есть умное обходное решение?


P.S .: Я буду счастлив, чтобы загрузить скрипт на Python, который генерирует «.natvis» файл для y'all, чтобы играть с вашими собственными типов, если я получу эту работу.

ответ

3

В случае, если вы все еще заинтересованы: Противный обходной путь заключается в вычислении каждой отдельной цифры после точки в natvis и обеспечивают тип помощника, который вы можете бросить свой тип данных POD для:

Сначала вы приведете простая структура в исходный код, который просто удерживает float или double member в вашем коде. Это позволяет вам вывести значение float в NATVIS_FLOAT и получить доступ к номеру.

struct NATVIS_FLOAT { float f;} 

Теперь вы можете создать визуализатор для типа NATVIS_FLOAT, где вы определяете каждую цифру после запятой точности, что вы хотите отобразить, например, 4:

<Type Name="NATVIS_FLOAT"> 
    <DisplayString>{(int)f}.{((int)(f*10))%10}{((int)(f*100))%10}{((int)(f*1000))%10}{((int)(f*10000))%10}</DisplayString> 
</Type> 

Наконец, вы можете бросить ваши член поплавка матрицы к NATVIS_FLOAT. Если ваша матрица имеет элемент float m [9], вы можете визуализировать одну запись, например

{(NATVIS_FLOAT*)&m[2],na} 
+0

Имейте +1 для ответа даже на один. Я пробовал что-то вроде этого, но я не мог понять, как получить постоянное количество цифр для отображения. Проблема заключается в том, что, хотя вы можете указать цифры после десятичной точки, вы не можете указывать их раньше. Так, например, это ломается с последовательностью {0,123, 1,123, 10,123, 100,123 и т. д.}. – imallett

+0

Конечно, вы могли бы использовать ту же технику для отображения ведущих нулей, по общему признанию выглядящих немного уродливыми. – ta55e

Смежные вопросы