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

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

[ 19312 查看 / 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++啊~~我的青春啊~~我哭,达人来帮忙看看吧!

看来LZ需要学会使用OLLYDBG……或者2K5也可以在ASM模式下调试XD
TOP

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

以下引用LOVEHINA-AVC在2006-5-15 4:09:17的发言:
看来LZ需要学会使用OLLYDBG……或者2K5也可以在ASM模式下调试XD


-v- avc 样,你以为随便一个人都能像你那计算机一样强大的过程化脑袋啊。你直接帮忙看源代码哪个字母大小写写错都好过你叫人家学软件调试啦。
签名是什么?能吃吗?-v-
TOP

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

哪有这么夸张……编译发现不了问题当然就得用汇编级调试啊-口-|||
TOP

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

编译器一般情况下肯定是正确的,这个基本可以不用怀疑。

这种问题一般是写程序的时候逻辑混乱造成的。
把代码列出来看看就可知。
飛べない翼に、意味はあるんでしょうか?
TOP

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

以下引用LOVEHINA-AVC在2006-5-15 7:03:17的发言:
哪有这么夸张……编译发现不了问题当然就得用汇编级调试啊-口-|||


经过优化后的汇编不是人类可读的....

不过如果我推测得不错的话,估计VC里面的Debug可以显示CPU窗口,可以进行汇编级别的步进;
Linux下GDB可以用Stepi模式;

不过链表程序的最佳Debug工具是DDD, D起来简直是享受啊 -v-|||
飛べない翼に、意味はあるんでしょうか?
TOP

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

这里有高手呀...................
还好我学的不是C++..............
这里是GalGame论坛的说..........
MicroShop
Calphi
http://www.myider.net/
TOP

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

看楼上的签名就知道跟MISHA一样都是用DELPHI的
TOP

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

楼上今后的进化目标就是UE打开一个EXE或者DLL马上就能在脑中转化为运行过程兼数据……

编程苦手路过……
悼念老陈……
南无阿弥多婆夜 哆他伽多夜 哆地夜他 阿弥利都婆毗 阿弥利哆 悉耽婆毗 阿弥唎哆 毗迦兰帝 阿弥唎哆 毗迦兰多 伽弥腻 伽伽那 枳多迦利 娑婆诃
TOP

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

以下引用zhangxiushen在2006-5-15 12:29:48的发言:
这里是GalGame论坛的说..........


不对哦,这里不是GALGAME论坛 -v-||
这里有时候是程序员论坛,有时候是物理论坛,有时候是考古论坛,有时候是八卦论坛,有时候是……

看你上论坛时的RP了 =v=++
像喜剧一样。
TOP