本帖最后由 杨为民 于 2023-12-30 13:52 编辑
二论 楼主10楼程序造假 楼主在59楼说:“1楼的程序,是没问题的,当时用函数名描述,是因为我匆忙且当时根本不知道函数名和函数指针的区别,所以10楼的程序改过来,用函数指针了。10楼的程序,才是有问题的” 楼主在63楼说:“我的实际程序是类似10楼的,用了函数指针,发现调用函数和被调函数的局部变量地址相同,大惑不解。2、在1楼发帖真心请教,但当时对函数名调用和函数指针调用有什么不同,是一无所知的,以为都是一样的,而且下班前匆忙,所以描述就用函数名调用了” 因此楼主的意思发帖的次序事实是:先有编译通过的实际程序,然后发帖;先有10楼的程序(与实际程序类似,只是后发),然后由于匆忙将10楼程序修改成1楼的程序先发了;并且发1楼程序时“对函数名调用和函数指针调用有什么不同,是一无所知的,以为都是一样的”。 、 那么我就基于这个事实来说明楼主的10楼造假了。 (1)楼主的10楼的代码如下: *g_pFunc =func2; // 函数指针指向func2()
func1()
{
xInfo * pStruc = ...; // 局部变量,指向某结构xInfo的指针,地址 0x0236
...
g_pFunc(); // 相当于调用func2()
// 到这里,发现 地址 0x0236 的内容被修改
...
}
func2()
{
uchar sw; // 局部变量,地址居然也是 0x0236
sw = 0; // 这里,就会把func1的局部变量pStruc给意外修改了
} 我对10楼的代码的测试结果如下,测试程序文后附上: 其中为不添新程序就将“func2”函数调到了前面。 (2)然而事实是10楼的程序用Keil的C51编译器编译根本通不过。首先写在函数外面的第9行就不是一个C51函数指针的定义语句格式,其次第14行“g_pFunc();”程序就根本不是C51的函数指针的调用格式。 (3)大家都知道如果一个程序被编译通过了,则表示其每行程序的语法都是正确,那么以后无论将其中几行抽出来进行编译都不会出错的,因此结论就是10楼的程序根本就是一个假的C51程序,是楼主杜撰出来的假程序。 (4)那么问题来了,对于10楼这样一个语法错误连编译都通不过的程序,楼主怎么样能够仿真运行到第15行,然后发现地址0x0236的内容被修改了呢?因此结论就是10楼所有的注释都是伪造的实验结果。 (5)更大的问题来了,楼主说10楼的程序是从起2万元的C51的实际程序中类似出来的,那么在其C51的实际程序中与10楼第14行程序对应的那一行程序一定是符合C51函数指针调用格式的,而不是像“g_pFunc();”这种有语法错误的。 请楼主将你实际程序中的这一行程序亮出来给我们看看是什么样子的?就这一行,不需要你的全部程序,不需要下载到产品,不需要按按键,只要拿出这一行符合C51语法的就行了。 (6)我认为楼主不会亮出来,因为他知道我下面一系列问题在等着他。 因此无需他回答,我在这里假定楼主有一行与10楼14行对应的真实程序,我假定那些作为注释的实验结果是存在且正确的,那么请问楼主: 这里是STC技术交流的论坛,这里是交流正确使用C51编译器的版块,你为什么要把你正确的C51程序故意修改成10楼第14行的语法错误程序发出来欺骗网友,你为什么要把你正确的C51程序故意修改成1楼的虚假程序发出来欺骗网友,你是什么居心?你要达到什么目的? (7)由于函数指针调用不是C51语言独有的,很多C语言编译器都支持,因此网络上有很多关于函数指针使用的程序例子和说明,用百度一查一大堆。 我注意到楼主在1楼的表达中“发现是编译器给2个具有调用关系的...”并没有指明编译器,因此存在一种可能,楼主既没有真实的C51程序,也没有那么坏的心眼,只是从网络上搜了一段程序,而那段程序中的函数调用语句正好就是10楼14行的“g_pFunc();”这种形式,然后工作太累,一不小心就当做自己的创作发了出来呢?当然这是恶意揣测,不过“函数指针”的百度百科里正好有这样格式的一行程序,恰好我又看到了,我就用小人之心度了君子之腹了。 (8)当然还有另外一种可能,按照四种组合之一楼主既有真实的C51程序,也没有那么坏的心眼,只是新的一年要到了,故意拿出一行错误程序骗骗大家,和大家开个玩笑。如果这样,楼主你这个玩笑开大了,让有的网友都认为C51存在BUG。
结论:不管楼主的主观动机是什么和有没有真实程序存在,楼主的第10楼彻底是一篇欺骗网友的谎言帖子,请楼主先在这里给大家道个歉!
|