现在的位置: 首页 > 综合 > 正文

图形化编辑器

2014年02月17日 ⁄ 综合 ⁄ 共 3425字 ⁄ 字号 评论关闭

《挑战编程》实在是一本很有意思的书。上面的ACM很有特点。但可惜的是没有很好的答案。网上貌似也找不到有相关的信息。

下面这道题来自《挑战编程》1.6.5 之Graphical Editor。是写一个命令解释器。

 

先是头文件:

 

 

以下是代码:

 

这是完全OK的代码。

现在写程序的水平一般是:编译没问题,很显然的bug不会有。但在运行一定出问题,要么运行的不正确,要不就是程序崩溃。

写完这程序后,果然不出所料的程序崩溃了……

 

问题是,在程序调用中,InitFuncArray完全没问题,且每个函数的函数名(实际上是一个指针)没问题。但在main中的第15行的while只做了一次,只是第一条命令执行了,然后程序就崩溃了……我惊奇了半天,依次检查,貌似都没有问题。
后来,才发现,是我定义的全局数组void (*pfunc[26])(char []);  中的函数指针值发生了改变……(补充一句,一开始,我定义的只是void (*pfunc[26])(char []);  ,并没有像现在的头文件中的28行所定义的那样,使用static来修饰)也就是说,pfunc数组中保存的函数名地址发生了改变……例如函数ColourXY,在InitFuncArray中初始化时是……3033。此时在pfunc中保存的也是该值。但在main中while调用到该函数时,再取到数组pfunc中保存的该函数的地址时,却发生了变化,不再是原来的……3033,而变成了 另一个完全不同的值。加上static后就OK了……
我就很是想不通,pfunc是被定义为了全局数组的,里面的值在程序退出之前是不会改变,但这里为什么改变了?……记得原来看《C专家编程》时,里面有提到,当在子函数中开辟指针指向的动态数组并返回该指针时,要将其声明为static。于是为了避免麻烦,我在这里就将之声明为全局数组,想不到还是出错。这是神奇的问题……
如果你知道为什么,麻烦告诉我一声。
代码看起来很多,但却是很简单的。
还有ColourR中,我一直想把他写得更简洁一些,奈何硬是写不好……太寒了……

 

*头文件中的Fatal.h是我自己写的宏。

抱歉!评论已关闭.