您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 程序调试与常见程序错误
1程序调试与常见程序错误目录一、在Codeblocks中调试程序......................................................................................................1二、存储路径设置问题...................................................................................................................4三、修改Codeblocks的设置..........................................................................................................4四、提示程序无法调试问题...........................................................................................................6五、常见错误分析...........................................................................................................................6六、程序出错的三种情况.............................................................................................................18七、常用的纠错方式.....................................................................................................................19一、在Codeblocks中调试程序1.注意事项不允许工程路径中含有空格、汉字。2.在相应行号后面点击鼠标左键设置断点3.打开WATCHS窗口24.点击调试按钮5.可以再watchs窗口看到自动变量。黄色三角表示程序暂停的位置36.通过单步运行按钮进行单步运行。7.也可以在debuger标签,command栏输入调试命令进行单步运行、打印变量值等操作。8.程序运行4二、存储路径设置问题1.如果不是默认安装路径,codeblocks就无法找到编译器和调试器,就会出现此类问题。解决办法:Settings——Compileranddebugger——Toolchainexecutables——Auto-detect。2.输出信息为“某个命令执行失败或异常终止”。解决方法:通常是相应的编译器找不到,试着将其所在路径放到path环境变量中去。3.输出编译错误,如某某文件找不到之类。解决方法:在项目中设置选项中加上路径(通常可利用customervariable项)。4.在调试程序的时候弹出类似XYZ-Debug:Thecompiler'ssetup(GNUGCCCompiler)isinvalid,soCode::Blockscannotfind/runthecompiler.Probablythetoolchainpathwithinthecompileroptionsisnotsetupcorrectly?!GotoSettings-Compileranddebugger...-Globalcompilersettings-GNUGCCCompiler-Toolchainexecutablesandfixthecompiler'ssetup.Skipping...Nothingtobedone(allitemsareup-to-date).这种警告。解决方法:这个错误提示已经说得很清楚了,找不到编译器,到菜单Settings-Compileranddebugger...-Globalcompilersettings-GNUGCCCompiler-Toolchainexecutables下去修复编译选项前提是你已经装了gcc如过没装,就去下个包含mingw的codeblocks,(mingw包含gcc编译器);三、修改Codeblocks的设置1.52.3.4.6四、提示程序无法调试问题多次调试一个程序时出现cannotopenoutputfilmD:\c++\文件名.exePermissiondenied解决方法:启动任务管理器,找到文件.exe关闭就可以了。五、常见错误分析1.忘记定义变量。例如:main(){x=3;y=6;printf(%d\n,x+y);}C要求对程序中用到的每一个变量都必须定义其类型,上面程序中没有对x、y进行定义。应在函数体的开头加intx,y;这是学过BASIC和FORTRAN语言的读者写C程序时常见的一个错误。在BASIC语言中,可以不必先定义变量类型就可直接使用。在FORTRAN中,未经定义类型的变量按隐含的I-N规则决定其类型,而C语言则要求对用到的每一个7变量都要在本函数中定义(除非已定义为外部变量)。2.输入输出的数据的类型与所用格式说明符不一样。例如:若a已定义为整型,b已定义为实型。a=3;b=4.5;printf(%f%d\n,a,b);编译时不给出出错信息,但运行结果将与原意不符,输出为0.00000016402它们并不是按照赋值的规则进行转换(如把4.5转换成4),而是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后两个字节中的数据按%d,作为整数输出)。3.未注意int型数据的数值范围。例如:一般微型计算机上使用的C编译系统,对一个整型数据分配两个字节。因此一个整数的范围为-215~215-1,即-32768~32767。常见这样的程序段:intnum;num=89101;printf(%d,num);得到的却是23565,原因是89101已超过32767。两个字节容纳不下89101,则将高位截去。即将超过低16位的数截去。即将89101减去216(即16位二进制所形成的模)。89101-65536=23565。有时还会出现负数。例如num=196607;输出得-1。因为196607的二进制形式为00000000000000101111111111111111去掉高位10,低16位的值是-1(-1的补码是:1111111111111111)。对于超过整个范围的数,要用long型,即改为longintnum;num=89101;printf(%ld,num);请注意,如果只定义num为long型,而在输出时仍用“%d”说明符,仍会出现以上错误。4.在输入语句scanf中忘记使用变量的地址符。例如:scanf(%d%d,a,b);这是许多初学者刚学习C语言时一个常见的疏忽,或者说是习惯性的错误,因为在其他语言中在输入时只需写出变量名即可,而C语言要求指明“向哪个地址标识的单元送值”。8应写成scanf(%d%d,&a,&b);5.输入时数据的组织与要求不符。例如:用scanf函数输入数据,应注意如何组织输入数据。假如有以下scanf函数:scanf(%d%d,&a,&b);有人按下面的方法输入数据:3,4这是错的。数据间应该用空格来分隔。读者可以用printf(%d%d,a,b);来验证一下。应该用以下方法输入:34如果scanf函数为scanf(%d,%d,&a,&b);对scanf函数中格式字符串中除了格式说明符外,对其他字符必须按原样输入。因此,应按以下方法输入:3,4此时如果用“34”反而错了。还应注意,不能企图用scanf(inputa&b:%d,%d,&a,&b);想在屏幕上显示一行信息:inputa&b:然后在其后输入a和b的值,这是不行的。这是由于有的读者以为scanf具有BASIC语言中的INPUT语句的功能(先输出一个字符串,再输入变量的值)。如果想在屏幕上得到所需的提示信息,可以另加一个printf函数语句:printf(inputa&b:);scanf(%d,%d,&a,&b);6.误把“=”作为“等于”运算符。例如:在许多高级语言中,用“=”符号作为关系运算符“等于”。例如,在BASIC或PASCAL程序中都可以写if(a=b)then…但在C语言中,“=”是赋值运算符,“==”才是关系运算符“等于”。如果写成if(a=b)printf(aequaltob);C编译系统将(a=b)作为赋值表达式处理,将b的值赋给a,然后判断a的值是否零,若为非零,则作为“真”;若为零作为假。如果a的值为3,b的值为4,a≠b,按原意不应输出“aequaltob”。而现在先将b的值赋给a,a也为4,赋值表达式的值为4。if语句中的表达式值为真(非零),因此输出“aequaltob”。这种错误在编译时是检查不出来的,但运行结果往往是错的。而且由于习惯的影响,程序设计者自己往往也不易发觉。7.语句后面漏分号。9例如:C语言规定语句末尾必须有分号。分号是C语句不可缺少的一部分。这也是和其他语言不同的。有的初学者往往忘记写这一分号。如:a=3b=4编译时,编译程序在“a=3”后面未发现分号,就把下一行“b=4”也作为上一行的语句的一部分,这就出现语法错误。有时编译时指出某行有错,但在该行上并未发现错误,应该检查上一行是否漏了分号。如果用复合语句,有的学过PASCAL语言的读者往往漏写最后一个语句的分号,如:{t=a;a=b;b=t}在PASCAL中分号是两个语句间的分隔符而不是语句的一部分,而在C中,没有分号的就不是语句。8.在不该加分号的地方加了分号。例如:if(a>b);printf(aislargerthanb\n);本意为当a>b时输出“aislargerthanb”的信息。但由于在if(a>b)后加了分号,因此if语句到此结束。即当(a>b)为真时,执行一个空语句。本来想a≤b时不输出上述信息,但现在printf函数语句并不从属于if语句,而是与if语句平行的语句。不论a>b还是a≤b,都输出“aislargerthanb”。又如:for(i=0;i<10;i++);{scanf(%d,&x);printf(%d\n,x*x);}本意为先后输入10个数,每输入一个数后输出它的平方值。由于在for()后加了一个分号,使循环体变成了空语句。只能输入一个整数并输出它的平方值。总之,在if、for、while语句中,不要画蛇添足多加分号。9.对应该有花括号的复合语句,忘记加花括号。例如:sum=0;i=1;while(i<=100)sum=sum+i;i++;10本意是实现1+2+…+100,即∑i。但上面的语句只是重复了sum+1的操作,而且循环永不终止。因为i的值始终没有改变。错误在于没有写成复合语句形式。因此while语句的范围到其后第一个分号为止。语句“i++;”不属于循环体范围之内。应改为while(i<=100){sum=sum+i;i++;}10.括号不配对。例如:当一个语句中使用多层括弧时常出现这类错误,纯属粗心所致。如:while((c=getchar()!='#')putchar(c);少了一个右括弧。11.在用标识符时,忘记了大写字母和小写字母的区别。例如:main(){inta,b,c;a=2;b=3;C=A+B;printf(%d+%d=%,A,B,C);}编译时出错。编译程序把a和A认作是两个不同的变量名处理,同样b和B,c和C都分别代表两个不同的变量。12.引用数组元素时误用了圆括弧。例如:main(){inti,a(10);for(i=0;i<10;i++)scanf(%d,&a(i));}C语言中对数组的定义或引用数组元素时必须用方括弧[]。13.在定义
本文标题:程序调试与常见程序错误
链接地址:https://www.777doc.com/doc-2150957 .html