我编写了一个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)和高级代码(PID和卡尔曼滤波器)接口。
它的设计对我来说似乎很合理,但这不是这个问题的意思。这个类有一个可怕的缺陷:在调试器中使用它是一种恐惧。
因为它是一个包含数组的结构,所以在检查Xcode中的变量时总会有一个恼人的间接级别(我假设在VisualStudio中)。由于Xcode有时无法正确地跟踪指针链并且我根本无法检查这些值,因此这进一步加剧了这种情况。如果我有这些对象的vector
,就会发生这种情况。
我意识到我可以自定义调试器以某种方式使用我的类型。但我想知道是否有可能
另一种存储我的Matrix数据的方式,以便它具有更好的“可调试性”?
这更像是一种“使用你的想象力”类型的问题而不是寻找最佳实践设计的问题。我只是好奇可以使用哪些替代类布局,同时仍然保持代码的通用性。
答案 0 :(得分:3)
这些Matrix类总是很难调试。与Rick不同,我更喜欢按照您的方式构建数据(即T m_data [NRows * NCols]),但您可能希望添加一些方法以使测试更容易一些;例如,一个自动打印矩阵的方法和一个在特定行和列上查找数据的方法可以让您的生活更轻松:
void printMat() const;
void printMatToFile( const char *fileName ) const;
T &get(int row, int col);
我通常使用gdb调试器,它允许您在调试时调用方法。我不知道你的调试器是否支持这个,所以你可能想尝试使用g ++ / gdb进行测试,或者在调试时使用一些支持函数调用的调试器。
答案 1 :(得分:3)
XCode允许您创建custom data formatters以您想要的任何方式格式化调试器中的数据。
答案 2 :(得分:2)
你可以先改变一下:
T m_data[NRows * NCols];
到此:
T m_data[NRows][NCols];
这可能对你有所帮助,因为它为调试器提供了一些关于数据结构的线索。请注意,如果实施此修改,您可能正在进行一些需要更改/消失的数组索引数学。
答案 3 :(得分:2)
VisualStudio为您的问题提供了一个非常好的解决方案,AutoExp.dat显然这对您没有帮助,因为您似乎没有使用VisualStudio,但对于使用VS的用户,他们可以创建自定义表达式甚至是显示数据的函数在调试器中。