花半个月写的代码,在今天调试的时候发生重大问题
闻所未闻、见所未见的问题
C++真是诡异
某半个月的努力完全XD了
达人们一起来想想到底是什么问题
程序已经通过编译器语法检查
我写的基类(已经通过了调试)中包含一系列的宏
#define NONIUS_NEXT (PosNonius++,Nonius->next)
#define NONIUS_PREV (PosNonius--,Nonius->prev)
#define NONIUS_HEAD (PosNonius = 0,head)
#define NONIUS_FOOT (PosNonius = Lenlist,foot)
#define NONIUS_NULL (PosNonius = 0,NULL)
Nonius是链表中的游标
PosNonius记录Nonius当前所在链表中的位置
靠上面的宏就可以保证游标Nonius和PosNonius同步工作
我从一开始写程序就保证只有glideNonius(ulong position)函数可以操作该游标
ulong是usigned long的别名
以上成员均被封装于类TLK的private区
public区有成员ulong LKgetValue(ulong position)函数
ulong TLK::LKgetValue(ulong position)
{
glideNonius(position);
return Nonius->value;
}
TLK的所有工作已经调试无误
之后TLK被类TTR以private形式继承
TTR中有public函数ulong TRgetChild(ulong ramusPos)
ulong TTR::TRgetChild(ulong ramusPos)
{
return LKgetValue(ramusPos);
}
在执行此函数时发生这样的错误:
PosNonius的数值总是和ramusPos相同
Nonius也有同样的位移(等效于执行ramusPos次NONIUS_NEXT)
这也就罢了
当ramusPos > 1时
TRgetChild函数返回后发生更为诡异的事:
PosNonius此时居然自动变成1
Nonius则跑到head上(即PosNonius为0时Nonius应该在的位置)
完全打破了两者的同步
尝试把形参名ramusPos改为ramusPs 之后
TRgetChild函数执行时
不再发生PosNonius的数值总是和ramusPs相同的情况
但是Nonius依然异常
函数返回后PosNonius还是自动变为1
Nonius还是自动回到了head上
顺便说一句在step模式下发生这些异常时并没有发现程序执行额外的代码
问题总是发生在调用和返回的时候
经过跟踪变量和step执行
目前排除以下情况:
1.成员覆盖
2.错误的代码操作
目前怀疑:
1.编译问题
2.某些特殊的继承规则
3.溢出
4.RPWT (这个最汗 —v—b)