Как сделать этот класс Matrix проще в использовании в отладчике - PullRequest
1 голос
/ 20 апреля 2009

Я написал матричный шаблонный класс C ++. Он параметризован своими размерами и типом данных:

template<int NRows, int NCols, typename T>
struct Mat {
    typedef Mat<NRows, NCols, T> MyType;

    typedef T value_type;
    typedef const T *const_iterator;
    typedef T *iterator;

    enum { NumRows = NRows };
    enum { NumCols = NCols };

    T m_data[NRows * NCols];

    // ... Lot's of operations and functions ...

// Some overloads
typedef Mat<2, 1, int> Vec2i;
typedef Mat<2, 1, float> Vec2f;
typedef Mat<3, 1, float> Vec3f;
typedef Mat<4, 1, unsigned char> Vec4ub;
typedef Mat<4, 4, float> Mat44f;
typedef Vec3f Vector;
typedef Vec4ub Color;
typedef Vec2f LonLat;

Это фантастический маленький класс, который обрабатывает много векторной арифметики и линейной алгебры. Кроме того, он может легко взаимодействовать как с кодом низкого уровня (OpenGL), так и кодом высокого уровня (фильтры ПИД и Калмана).

Мне кажется, что его дизайн звучит правдоподобно, но вопрос не в этом. У этого класса есть один ужасный недостаток: это ужас для использования в отладчике .

Поскольку это структура, которая содержит массив, всегда существует один раздражающий уровень косвенности при рассмотрении переменных в XCode (и я предполагаю, что в VisualStudio). Это еще более усугубляется тем фактом, что XCode иногда не в состоянии правильно следовать цепочкам указателей, и я не могу проверить значения вообще. Это происходит, если у меня есть, скажем, vector этих объектов.

Я понимаю, что мог бы настроить отладчик так, чтобы он как-то работал с моим шрифтом. Но мне было интересно, если есть, возможно,

другой способ хранения данных моей матрицы, чтобы она имела лучшую «отлаживаемость» ?

Это скорее вопрос типа «используй свое воображение», чем вопрос о создании наилучшей практики. Мне просто любопытно, какие альтернативные макеты классов можно использовать при сохранении общего характера кода.

Ответы [ 4 ]

3 голосов
/ 20 апреля 2009

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

3 голосов
/ 20 апреля 2009

Подобные классы Matrix всегда сложно отладить. В отличие от Рика, я предпочитаю, чтобы данные были структурированы так, как у вас есть (т. Е. T m_data [NRows * NCols]), но вы можете добавить некоторые методы, чтобы сделать тестирование немного легче; например, метод, который автоматически печатает матрицу, и метод поиска данных в определенной строке и столбце может упростить вашу жизнь:

void printMat() const;
void printMatToFile( const char *fileName ) const;
T &get(int row, int col);

Я обычно использую отладчик gdb, который позволяет вам вызывать метод при отладке. Я не знаю, поддерживает ли ваш отладчик это, поэтому вы можете попробовать использовать g ++ / gdb для тестирования или какой-нибудь отладчик, который поддерживает вызовы функций во время отладки.

2 голосов
/ 20 апреля 2009

VisualStudio имеет отличное решение вашей проблемы, AutoExp.dat Очевидно, что это не поможет вам, поскольку вы, похоже, не используете VisualStudio, но для тех, кто использует VS, они могут создавать собственные выражения и даже функции для отображения данных в отладчике.

2 голосов
/ 20 апреля 2009

Вы можете начать с изменения этого:

T m_data[NRows * NCols];

к этому:

T m_data[NRows][NCols];

Это может помочь вам, поскольку дает отладчику немного больше информации о структуре данных. Обратите внимание, что вы, вероятно, выполняете некоторую математику индекса массива, которая должна была бы измениться или исчезнуть, если бы вы внедрили эту модификацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...