注册 登录
查看: 2633|回复: 38

【实战挑战】是程序员的就来挑战一下解bug

[复制链接]
发表于 2014-11-17 18:45:49 | 显示全部楼层 |阅读模式
重新置顶一下这帖子。是程序员,就自然要会解bug。不少队伍都已经过了校赛了,但还是出现各种奇怪的bug无法解。不妨用这题目来练习解bug能力吧。




我们推出了每日一题,里面涉及很多编程的基础知识,很多的知识都是同学们在大学课堂里从没接触过的,都是我们根据自己的项目经验来编写的题目,还有部分是网上收集的经典题目。我们的目的在于提高初学者的编程能力,更好地适应市场的需求。
至今,每日一题里出了很多题目,基本包含了常用的编程知识,但很多都是知识点讲解,没能给大家实战。如果每日一题的题目都看懂了,那么下一步,是程序员,就要会解bug。

这里有个工程,明明已经在头文件里定义了数据类型,C文件中包含了相应的头文件,但就是提示没定义。
大家下载一下代码,研究一下出错的原因在哪里,你是怎么定位到这问题的。这题目是考研你解bug的能力,所以希望大家认真去分析代码,把自己解bug的过程记录下来。




工程是基于IAR 6.3版本。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

回复

使用道具 举报

 楼主| 发表于 2014-11-17 18:48:02 | 显示全部楼层
这题目,是考验大家的解bug能力,不是答案。

大家好好做一下,然后把解bug的思路告诉大家,展示一下自己的解bug手段。

这题目是出自论坛网友的gui工程,晚点等大家解出来,我再公开坛友的名字啦。
回复 支持 反对

使用道具 举报

发表于 2014-11-17 21:58:34 来自手机 | 显示全部楼层
山外大哥   每日一题有好多都看不懂   咋办呀  从哪开始学啊
回复 支持 反对

使用道具 举报

发表于 2014-11-17 22:39:17 | 显示全部楼层
先点option,找到c/c++Compiler,然后再找到preprocessor,在下面添加栏中添加LCD路径或其他路径。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-17 22:51:51 | 显示全部楼层
板正的 发表于 2014-11-17 21:58
山外大哥   每日一题有好多都看不懂   咋办呀  从哪开始学啊

每日一题,都是有难度的题目,都是平时课题不讲,但真正项目又需要用到的知识。

如果看不懂,你可以自己百度一下,搜索一下相关的知识,做下笔记,最好可以把心得分享到论坛来,帮助更多的初学者。

如果还是不懂,可以发帖来交流,大家一起探讨一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-17 22:52:15 | 显示全部楼层
abc342501 发表于 2014-11-17 22:39
先点option,找到c/c++Compiler,然后再找到preprocessor,在下面添加栏中添加LCD路径或其他路径。

这个不对,你可以下载代码来,编译一下,看看如何解决。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-18 13:42:50 | 显示全部楼层
这题目估计难度太大了,给几个基础比较好的学生做,都没一个做出来
回复 支持 反对

使用道具 举报

发表于 2014-11-18 19:06:27 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-18 13:42
这题目估计难度太大了,给几个基础比较好的学生做,都没一个做出来

山外哥,答案是什么?好像知道。
回复 支持 反对

使用道具 举报

发表于 2014-11-19 22:25:40 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-18 13:42
这题目估计难度太大了,给几个基础比较好的学生做,都没一个做出来

  不好意思,找好了,不太清楚都弄了什么了,感觉有点多,这是最主要的:

把LCD.H 头文件的修改,就是宏定义防重复包含知识,LCD_H修改为 _LCD_H_   还有把别的要改

还有加上一下等等内容,
typedef         unsigned         char                u8;          //无符号型
typedef         unsigned         short int        u16;
typedef         unsigned         long  int        u32;
typedef            __UINT64_T_TYPE__       u64;

typedef         char                                        s8;          //有符号型
typedef         short int                                s16;
typedef         long  int                                s32;
typedef            __INT64_T_TYPE__             s64;

失敬失敬


回复 支持 反对

使用道具 举报

发表于 2014-11-20 10:51:27 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-17 18:48
这题目,是考验大家的解bug能力,不是答案。

大家好好做一下,然后把解bug的思路告诉大家,展示一下自己 ...

山外哥,什么时候给答案。我把工程修改到零错误零警告要不我上传了吧:
我都把自己的找错过程编辑好了(还有截图),不过有点不敢往上贴,怕错了,闹笑话。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 10:56:51 | 显示全部楼层
gsc617 发表于 1416451887
山外哥,什么时候给答案。我把工程修改到零错误零警告要不我上传了吧:
我都把自己的找错过程编辑好了(还有截图),不过有点不敢往上贴,怕错了,闹笑话。
哈哈,你直接上传吧,没关系的。错了,别人指出来,反而可以学到东西。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 11:04:26 | 显示全部楼层
gsc617 发表于 2014-11-19 22:25
不好意思,找好了,不太清楚都弄了什么了,感觉有点多,这是最主要的:
[/ba ...

是的,你做对了。不过解题的思路是最重要的。show一下你的解题思路吧。
回复 支持 反对

使用道具 举报

发表于 2014-11-20 12:57:39 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-20 11:04
是的,你做对了。不过解题的思路是最重要的。show一下你的解题思路吧。

山外哥,我说一下我的思路,也不知道对不对:

首先这个工程真不是一般大(文件1000多个,晕),编译好几分钟才完成,然后错误和警告很多。

1.其中变量等提示没找着,没定义。我就打开工程的预编译配置看有没有把所有路径都加入了。


2.工程的预编译配置似乎没问题,报错警告依然不断,我就定位错误和警告。然后用source insight跟踪

说也怪,发现都在几乎都是到了LCD.H头文件那里都能找着,,,瞎弄了半天发现

#ifndef LCD_H
#define LCD_H
...
...
#endif
与别的头文件明显不同:
#ifndef _COMMON_H_
#define _COMMON_H_
...
...
#endif

3.把LCD_H修改为 _LCD_H_   之后就提示错误好像是只有u16,s16没定义:
Error[Pe020]: identifier "s16" is undefined C:\Users\admin\Desktop\vcan_GUI V1.1\UCGUI_Ports\ucgui_ports.c 162


当然警告也还是有,提示似乎是因为没有外部声明引起的:
像Warning[Pe223]: function "LCD_Fill" declared implicitly C:\Users\admin\Desktop\vcan_GUI V1.1\UCGUI_Ports\ucgui_ports.c 238

如法炮制。

4.往报错文件里加入定义过u16,s16的头文件#include "chshell.h"//gan 添加

或者添加:
typedef         unsigned         char                u8;          //无符号型
typedef         unsigned         short int        u16;
typedef         unsigned         long  int        u32;
typedef            __UINT64_T_TYPE__       u64;

typedef         char                                        s8;          //有符号型
typedef         short int                                s16;
typedef         long  int                                s32;
typedef            __INT64_T_TYPE__             s64;

5.source insight 定位到了mlcd.c文件,修改mlcd.h的函数文件外部声明。

6.完成,还有几个警告(volatile修饰的变量一般不直接参与运算,强制类型转换不严格,假如要修改就零警告)。

也不知道有没有弄巧成拙,大伙见笑了,呵呵...不过我们实验室的linux大神说,程序找茬这事儿,是个耐心无聊活,意义似乎不太大。

附件使用IAR 7.2版本编译配置过,请用7.2或者以上打开。   附件太大,等等在想解决方法呢

回复 支持 反对

使用道具 举报

发表于 2014-11-20 12:58:33 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-20 11:04
是的,你做对了。不过解题的思路是最重要的。show一下你的解题思路吧。

附件太大127M怎么上传呀教我压缩文件吧

回复 支持 反对

使用道具 举报

发表于 2014-11-20 12:59:06 | 显示全部楼层
学习了。。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 13:09:05 | 显示全部楼层
gsc617 发表于 1416459459
山外哥,我说一下我的思路,也不知道对不对:

首先这个工程真不是一般大(文件1000多个,晕),编译好几分钟才完成,然后错误和警告很多。

1.其中变量等提示没找着,没定义。我就打开工程的预编译配置看有没有把所有路径都加入了。


2.工程的预编译配置似乎没问题,报错警告依然不断,我就定位错误和警 ...
你找对了地方,不过有点碰巧。

是修改那个地方,这个没错。不过原因就错了。不是因为没前后加 _ 。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-20 13:16:32 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-20 13:09
你找对了地方,不过有点碰巧。

是修改那个地方,这个没错。不过原因就错了。不是因为没前后加 _ 。

求真相-.-
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-20 13:53:48 | 显示全部楼层
有怀疑过重复包含,但是不是有ifndef了吗~好皎洁~还是差点基础支撑
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 14:04:39 | 显示全部楼层
gsc617 发表于 2014-11-20 13:16
求真相-.-

是重复定义了。LCD_H已经定义了导致的。如何定位到这问题上,是值得思考的。我们的书上也有谈到解决这问题的方法。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 14:04:48 | 显示全部楼层
Ray______ 发表于 2014-11-20 13:53
有怀疑过重复包含,但是不是有ifndef了吗~好皎洁~还是差点基础支撑

是重复定义了。LCD_H已经定义了导致的。如何定位到这问题上,是值得思考的。我们的书上也有谈到解决这问题的方法。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-20 15:01:27 | 显示全部楼层
本帖最后由 gsc617 于 2014-11-20 15:02 编辑
山外メ雲ジ 发表于 2014-11-20 14:04
是重复定义了。LCD_H已经定义了导致的。如何定位到这问题上,是值得思考的。我们的书上也有谈到解决这问 ...

难怪我当时好像改为_MLCD_H_也可以
想起一个笑话:一个程序员找错误,找个好几天越改越多错误非常烦恼;

下一天,他仍然不放弃继续找错,依然有很多错误,甚至越来越多;

继续了一段时间,错误仍然....终于在一天,就在他修改后一编译竟然没报错了。

这是他说了一句:他妈的我到底改哪里了呀







回复 支持 反对

使用道具 举报

发表于 2014-11-20 20:17:04 | 显示全部楼层
gsc617 发表于 2014-11-20 15:01
难怪我当时好像改为_MLCD_H_也可以
想起一个笑话:一个程序员找错误,找个好 ...

有时候一口气写一堆程序,想整理分布好点,居然一堆错误,改了好久没改回来,最后全部弄回原来的一两个文件放所有代码= =#
回复 支持 反对

使用道具 举报

发表于 2014-11-21 00:34:46 | 显示全部楼层
本帖最后由 ExiBQ 于 2014-11-21 00:37 编辑
gsc617 发表于 2014-11-20 12:58
附件太大127M怎么上传呀教我压缩文件吧

直接运行“删除临时文件.bat”就小多了
回复 支持 反对

使用道具 举报

发表于 2014-11-28 18:53:55 | 显示全部楼层
应该是Linker页面的icf设置问题吧
回复 支持 反对

使用道具 举报

发表于 2014-11-28 19:03:36 | 显示全部楼层
好吧,,看了下你们的回复,初学者吓尿了
回复 支持 反对

使用道具 举报

发表于 2014-12-3 16:42:05 | 显示全部楼层
看不太懂

回复 支持 反对

使用道具 举报

发表于 2014-12-3 17:00:14 | 显示全部楼层
眼镜蛇 发表于 2014-11-28 18:53
应该是Linker页面的icf设置问题吧

肯定不是,是出现重复宏定义导致。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-4 00:04:15 | 显示全部楼层
应该是第一个typedef定义没加分号
回复 支持 反对

使用道具 举报

发表于 2014-12-4 16:40:40 | 显示全部楼层
长见识了
回复 支持 反对

使用道具 举报

发表于 2015-1-5 09:45:46 | 显示全部楼层
此处定义的是u32 LCD_COLOR
回复 支持 反对

使用道具 举报

发表于 2015-1-10 16:41:36 | 显示全部楼层
等学到这一步才回来看  
回复 支持 反对

使用道具 举报

发表于 2015-1-19 11:47:48 | 显示全部楼层
坑啊   能说说解题思路吗
回复 支持 反对

使用道具 举报

发表于 2015-1-27 21:17:05 | 显示全部楼层
我记得第一次找的时候,找到两个lcd.h,一个大写LCD.h,一个小写lcd.h,都是#define LCD_H,后来怎么也找不到那个小写lcd.h了。。。。
回复 支持 反对

使用道具 举报

发表于 2016-3-5 16:36:12 | 显示全部楼层
看看
回复 支持 反对

使用道具 举报

发表于 2016-6-26 12:18:41 | 显示全部楼层
应该在定义前加个extern就没问题了吧
回复 支持 反对

使用道具 举报

发表于 2016-8-18 11:01:16 | 显示全部楼层
用MDK的时候也遇到过,应该是要把结构体声明放到.c源文件而不是.h头文件,原因不知道
回复 支持 反对

使用道具 举报

发表于 2016-9-4 17:09:33 | 显示全部楼层
我开始方了0.0
回复 支持 反对

使用道具 举报

发表于 2016-11-4 18:48:26 | 显示全部楼层
长见识了。。。

回复 支持 反对

使用道具 举报

发表于 2016-11-7 14:12:44 | 显示全部楼层
没想到两年就这么过了。。。
那时候调成功的图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部