学习心得1------调试代码
版权声明:本文为博主(汉诺塔少年)原创文章,非商用自由转载-保持署名-著名出处,谢谢。https://blog.csdn.net/qq_40780910/article/details/82468476
心得1------调试代码
#为什么写这篇博客?
这个假期在家学习,我开始对老师说的一句口头禅有了更多的体会:“当你以后开始参加工作,
你会发现大多数时间是花在调试(修改)代码上的,而不是在写代码上的。”
虽然不一定对每个场合都试用,但是这种情况应该是普遍的。
学技术的人都应该明白,解决bug的过程既是提升能力的过程也是积累经验的过程。
只有踩过了坑,才知道那里有翔,以后就不会再踩了。
所以这篇文章想说怎么尽量开心踩坑的。
对于写代码的人员而言,解决bug的过程着实考验人的心智,这是一个综合考量人的过程。
很多人吃不了这份苦,遇到问题就启动屏蔽模式,眼不见心不烦(人类的天性)。
学习东瞧瞧西看看,结果就是什么都略懂(其实就是不懂),无一精通。
扯了那么多,那么遇到bug的时候有什么好的解决方法呢?
1)先自己想办法调试
自己尝试去调试,可以上网查资料看看其他人类似的经历,当然有时候找不到合适的答案。
Because往往编程里面大多数是逻辑错误,是自己代码运算思路或者某些功能用错了地方导致不可预知的错误。
查找时候关键词是个很重要的地方,你不妨从多个角度去尝试搜索,结果可能会让你满心欢喜,对出现问题的猜想角度或者
提炼角度的不同能让你得到更加多样的搜索结果。
自己解决问题的过程真的很重要,只有自己亲自动手综合运用各种方法解决一个问题时后你才会收获更多经验和对
调试过程出现的每一个细节的掌握。
2)出去走走
反复调试还是没有发现问题的时候,不着急的话建议出去走走换个环境,说不定再次回到电脑前一切问题就迎刃而解,你会惊叹:“怎么是这里呀!我怎么没想到!”
这种情况其实也很好理解,你会发现上面的情况很类似于考试时候。
在考场的时候反复运算某道题,结果老是算不对,当你走出考场的时候,你的脑袋里面闪出一道柯南办案时候的闪电:“1+1=1”呀!我怎么会这么想问题?
其实这就是人们思维的惯性,当你得不出想要的结果时候恰恰是因为你老是用同一套思路去思考东西而这个思路已经反复被你验证是不对的。就像考试时候高度紧张你一直把1+1=1当成了真理,自然就不会发现谬误所在。
当你休息了一趟回来之后也许你的脑子思路就转变了,或许就能轻松的看出代码中的逻辑错误。
3)跟合适的人请教
或许有人会说,马上要交作业了,马上要考试了,我没有时间去换心情!那该怎么办?
第三种方法就是学会请教别人。
如果有耐心的学长和老师或是同事可以请教不妨多多请教,有时候他们的一席话能省了你好几天的苦恼,这就是向牛人请教的力量。
须知每个人都是从菜鸟开始从事一个行业,学习一门知识。运用正确的方法,努力学习的态度,三年五年足够你成为任何一个领域的牛人。
4)别忘了做总结
最后就是不断总结每次解决bug的经验,多做做笔记,写一些心得,想想这次解决的bug跟以前的有什么关联吗?
自己还能从中学到什么东西吗?
这不奇怪,当你积累越多之后你处理问题的效率就越高,思路就更加广阔。
需要多扯一句蛋,那就是学习需要正确的方法和坚韧的品行,有句很励志的话:
那些看起来好不费力的牛人都是在敲坏多少个键盘后练成的。(当然,现在键盘都比较好,想敲坏也不容易~)
摆正了心态,在解决问题中不断提升自己,既是一种乐趣,最大的好处还是:
Make more money!(学习的动力之一)
接下来讲一讲我最近写代码时候遇到的一个问题:
昨天调试的时候发现一个奇怪现象,代码运行正确,也没有任何的错误警告:
但是代码运行到了某个地方就不运行了,
如果设置断点或者在该处cout<<”在这里”;也会发现没有该语句的输出。
我百思不得其解,甚至某个时刻偏执的认为是自己莫名其妙设置了什么或者是编译软件出现了bug,
最后检查出来的时候还是发现是自己代码的问题,没有错,其实几乎每
一次出现不可理解的错误肯定是自己的代码出现了问题,所以遇到暂时不理想的输出结果时候,
具体的代码不需要一行行去抠,我只想说我遇到的问题:
我写的是一个简单的图,然后生成最短路径。最后打印最短路径的函数,但是打印函数怎么也用不了。:
我采取了如下的措施:
第一步,自己解决:
1)设置断点
2)cout大法(很常用且有效的一种方法,在出现异常附件输出几句标识)
我发现还是没有用,代码像陷入了百慕大三角,就是不执行87行以后的代码。
然后我启动下一步,出去走一走,发现没有没有用。
然后启动第三步,请教其他人。
根据我的描述,前辈告诉我某段没有执行就结束肯定是前面代码提前推出了,要到前面去查。
最后一番纠结(此处忽略一万字)果然在前面找到了错误:
在一个函数里面运行到return 语句的时候效果是直接退出整个函数,而不是仅仅退出for循环。
我误以为是退出for循环,因为课本就是这么写的,我顺着课本的思路想当然的就是这样子(1+1=1)
整个函数已经退出,接下来的代码自然不会被执行了。
没想到课本上的代码也会出错,看来是写课本的人用心良苦~
最后,附上代码供感兴趣的童鞋研究:
#include<iostream>
using namespace std;
const int MAXSIZE = 20;
class MGraph
{
public:MGraph(char a[], int n, int e);public:int vNum, arcNum;int arc[MAXSIZE][MAXSIZE];char vertex[MAXSIZE];
};MGraph::MGraph(char a[], int n, int e)
{int i, j, k;vNum = n; arcNum = e;for (k = 0; k < n; k++) vertex[k] = a[k];for (i = 0; i < n; i++)for (j = 0; j < n; j++)if (i == j)arc[i][j] = 0;elsearc[i][j] = 100000;for (int k = 0; k < e; k++){cout << "请输入第" << k << "个相邻节点的下标: ";cin >> i >> j;cout << "请输入权值: ";cin >> arc[i][j];}
}
int FindMin(int Disk[], bool S[], int n)
{int k = 0, min = 100000;for (int i = 0; i < n; i++){if (!S[i] && min > Disk[i]){min = Disk[i]; k = i;}}if (min == 100000) return -1;return k;
}
void Print(int Disk[], int Path[], int n)
{for (int i = 0; i < n; i++){cout << 'V' << i << ":" << Disk[i] << "\t{V" << i;int pre = Path[i];while (pre!= 0&&pre!=-1){cout << 'V' << pre;pre = Path[pre];}cout << "}" << endl;}
}void ShortPath(MGraph G, int v, int Disk[], int Path[])
{bool S[MAXSIZE] = { false };for (int i = 0; i < G.vNum; i++){Disk[i] = G.arc[v][i];if (Disk[i] != 100000)Path[i] = v;elsePath[i] = -1;}S[v] = true; Disk[v] = 0;for (int i = 0; i < G.vNum; i++){if ((v = FindMin(Disk, S, G.vNum)) == -1)return;S[v] = true;for (int j = 0; j < G.vNum; j++) //全部扫描一遍if (!S[j] && (Disk[j] > G.arc[v][j] + Disk[v])){Disk[j] = G.arc[v][j] + Disk[v];Path[j] = v;}}Print(Disk, Path, G.vNum);
}int Disk[MAXSIZE];
int Path[MAXSIZE];
int main()
{ char a[] = "012345";MGraph graph(a, 6, 8);ShortPath(graph, 0, Disk, Path);
}
学习心得1------调试代码相关推荐
- 2017-03-02学习心得之Java代码
package com.lovo.classes; import java.util.Random; import java.util.TreeSet; import java.util.Scanne ...
- STM32学习心得:SPI-Flash-W25Q16DV
前言 目前正在学习STM32单片机的基础知识,通过库函数实现想要的一些功能.这篇文章主要介绍的是片外的Flash的操作,Flash的型号是W25Q16DV(芯片介绍在后面),通信的方式是SPI通信. ...
- STM32学习心得十九:电容触摸按键实验及相关代码解读
记录一下,方便以后翻阅~ 主要内容 1) 电容触摸按键原理: 2)部分实验代码解读. 实验内容 手触摸按键后,LED1灯翻转. 硬件原理图 上图,TPAD与STM_ADC用跳线帽相连,即TPAD与PA ...
- STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读
记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...
- STM32学习心得十八:通用定时器基本原理及相关实验代码解读
记录一下,方便以后翻阅~ 主要内容: 1) 三种定时器分类及区别: 2) 通用定时器特点: 3) 通用定时器工作过程: 4) 实验一:定时器中断实验补充知识及部代码解读: 6) 实验二:定时器PWM输 ...
- Python语言学习:python语言代码调试—异常处理之详细攻略
Python语言学习:python语言代码调试-异常处理之详细攻略 目录 python语言代码调试-异常处理 异常捕捉可以使用 try/except 语句 相关文章 Python3 错误和异常 | 菜 ...
- BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) -- 转贴自 wolfenstein (NeverSayNever)
BT源代码学习心得(七):跟踪服务器(Tracker)的代码分析(HTTP协议处理对象) author: wolfenstein (NeverSayNever) 上次我们分析了Tracker类初始化的 ...
- BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化) -- 转贴自 wolfenstein (NeverSayNever)
BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化) author:wolfenstein Tracker在BT中是一个很重要的部分.这个名词我注意到以前的文章中都是直接引用,没 ...
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) - 转贴自 wolfenstein (NeverSayNever)
BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) author: wolfenstein 通过上一次的分析,我们已经知道了Tracker采用http协议和客户端通 ...
最新文章
- 全网最详细 TCP 参数讲解,不用担心没有面试机会
- 决策树--从原理到实现
- Flask实现成绩查询接口
- PyQt5利用QPainter绘制各种图形
- 【温故知新】CSS学习笔记(背景)
- 中矿新生赛 H 璐神看岛屿【BFS/DFS求联通块/连通块区域在边界则此连通块无效】...
- 9.6分神作又出续集,这是成年人最不敢直视的现实
- 测试技术培训:如何测试磁盘写的速度
- 力扣-剑指Offer-57 和为s的连续正数序列
- linux怎么更改rpcbind端口号,rpcbind_rpcbind服务是什么_rpcbind 端口
- 分布式定时任务之3:elasticjob状态一直是分片待调整
- EtherCAT中AX58100烧写xml文件的说明(2)-TwinCAT软件安装
- 你有必要不沾计算机一段时间英语,2014新人教版八年级英语下册第一单元必背词组及句子...
- win10下如何安装win7自带的照片查看器。
- reincarnation server
- 文件名太长无法删除怎么办
- 高德地图大头针功能_有关于高德地图的大头针下落动画。还有就是高德地图的设置...
- Wireshark对pop3抓包分析
- C++ 实现斗地主玩法
- win10笔记本相机打开黑屏无法打开笔记本相机
热门文章
- NumPy二维数组-行向量、列向量
- ROS总结 rosdep update时 遇到了timeout报错
- Photoshop 图像去底技巧 N 种
- 计算机图形学上机报告绘制圆,计算机图形学上机实验报告
- Java面向对象练习-电话本管理系统
- Android样式和主题背景·
- AutoCad 设置绘图环境
- 按键精灵获取特殊文件夹路径
- 前微软CEO的“离别礼物“:Cortana差点改名为“Bingo”
- 新型电力系统 3D 可视化运维管理,推动能源绿色转型