KeyFC欢迎致辞,点击播放
资源、介绍、历史、Q群等新人必读
KeyFC 社区总索引
如果你找到这个笔记本,请把它邮寄给我们的回忆
KeyFC 漂流瓶传递活动 Since 2011
 

C++啊~~我的青春啊~~我哭,达人来帮忙看看吧!

[ 19361 查看 / 84 回复 ]

花半个月写的代码,在今天调试的时候发生重大问题
闻所未闻、见所未见的问题
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)
分享 转发
这年头
做魔王难
做公主更难
TOP

回复:C++啊~~我的青春啊~~我哭,达人来帮忙看看吧!

目前确实也找不到程序到底逻辑上有什么问题
估计前期策划不好到后期就这样了
即便有问题Debug也很难找
本人根本不懂win32汇编 —v—

看来是不能在上面继续拖时间了
现在我决定重写这一部分的代码
幸好只是两个星期的工作量

谢谢大家提供意见!!
这年头
做魔王难
做公主更难
TOP

回复:C++啊~~我的青春啊~~我哭,达人来帮忙看看吧!

以下引用kkkklll在2006-5-17 19:42:32的发言:
我的BUG 多的意思是:C++里面什么类型都可以互相换,if()里面加什么都可以通过编译,if(函数名), if(i=1)( if(i==1) )这种错误也很容易发生(结果很多地方都统一写成if(1==i)了,呵呵),而且每个初始的内存都要自己多花一步去释放,弄不好就变成内存泄露了……


貌似这些问题我也很头痛,不过,现在习惯一些了
C++的操作安全性被诟病已经不是一天两天了
对于企业、公司这些追求收益和效率的团体来说更是明显

但是对于我这种DIY粉丝来说,
C++程序几乎每一件事情都可以让你自己来做,让你知道究竟,让你随意写
这一点使他的主要魅力
如果时间不是很紧
用C++写程序是乐趣无穷的!
这年头
做魔王难
做公主更难
TOP

回复:C++啊~~我的青春啊~~我哭,达人来帮忙看看吧!

以下引用忧郁の丸子在2006-5-20 18:22:46的发言:
这里没人用JAVA吗?- -|||


用,但是不多
自己用得多的还是C++和Delphi
对Java的感觉总是很矛盾,因为用起来总是感觉限制很大
C#至今不打算用,大概是对那个概念不感兴趣吧
这年头
做魔王难
做公主更难
TOP