《C语言上机程序调试功能键及常见错误提示.doc》由会员分享,可在线阅读,更多相关《C语言上机程序调试功能键及常见错误提示.doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言上机程序调试功能键及常见错误提示1常用健 : 激活系统菜单: 将光标在编辑窗口和、信息窗口之间切换: 加载一个文件+: 切换到用户屏查看程序运行结果 : 编译+ : 编译并运行 : 存盘+ : 切换窗口和全屏 : 关闭和显示信息窗口2块操作 KB: 定义块首 KK: 定义块尾 KV: 块移动 KC: 块复制 KY: 块删除 KH: 取消块定义3查找、替换和删除操作 QF: 查找字符串 QA: 查找并替换字符串 Option: G(全程), B(向文件头), N(直接替换) Y : 删除一行 QY: 删除从光标位置到行末的所有字符4编译中的常见错误(1)警告类错误 ?XXXdeclare
2、but never used 变量XXX已定义但从未用过。 ?XXXis assigned a value which is never used 变量XXX已赋值但从未用过。 ? Code has no effect 程序中含有没有实际作用的代码。 ? Non-portable pointer conversion 不适当的指针转换,可能是在应该使用指针的地方用了一个非0的数值。 ? Possible use of XXXbefore definition 表达式中使用了未赋值的变量 ? Redeclaration of main 一个程序文件中主函数main不止一个。 ? Suspicio
3、us pointer conversion 可疑的指针转换。通常是使用了基本类型不匹配的指针。 ? Unreachable code 程序含有不能执行到的代码。(2)错误或致命错误 ? Compound statement missing in function main 程序结尾缺少括号。 ? “”expected; “(”expected等 复合语句或数组初始化的结尾缺少“)”;“(”。 ? Case outside of switch case 不属于Switch结构,多由于switch结构中的花括号不配对所致。 ? Case statement missing : switch结构中的
4、某个case之后缺少冒号。 ? Constant expression required 定义数组时指定的数组长度不是常量表达式。 ? Declaration syntax error 结构体或联合类型的定义后缺少分号。 ? Declaration was expected 缺少说明,通常是因为缺少分界符如逗号、分号、右圆括号等所引起的。 ? Default outside switch Default 部分放到了switch结构之外,一般是因为花括号不匹配而引起的。 ? do statement must have while do语句中缺少相应的while部分。 ? Expression
5、syntax 表达式语法错。如表达式中含有两个连续的运算符 ? Extra parameter in call fun 调用函数fun时给出了多余的实参。 ? Function should return a value 函数应该返回一个值,否则与定义时的说明类型不匹配。 ? Illegal use of pointer 指针被非法引用,一般是使用了非法的指针运算。 ? Invalid pointer addition 指针相加非法。一个指针(地址)可以和一个整数相加,但两个指针不能相加。 ? Lvalue required 赋值运算的左边是不能寻址的表达式。 ? Misplaced else
6、 程序遇到了没有配对的else ? No matching 表达式中的括号不配对。 ? Pointer required on left side of_ 在“_”运算的左边只能允许一个指针而不能是一个一般的结构体变量或联合类型的变量。 ? Statement missing; 程序遇到了后面没有分号的语句。 ? Too few parameters in call 调用某个函数时实参数目不够。 ? Unable to open include file XXXXXXXXXXX 头文件找不到。 ? Unexpected 或:或 在不希望的地方使用了或:。 ? Undefined symbol
7、Xin function fun 函数fun中的变量X没有定义。5.连接中的常见错误主要错误类似于“undefined symbol _print in modula xxx”(print没有定义),通常是函数名书写错误。6.运行中的常见错误?Abnormal program termination 程序异常终止。通常是由于内存使用不当所致。?Floating point error : Domain 或Divide by 0 运算结果不是一个数或被0 除?Null pointer assignment 对未初始化的指针赋值,程序有严重错误。?User break 在运行程序时终止。7.程序的
8、跟踪调试利用Run菜单可以进行程序的跟踪调试(1)GO to Cursor ()选择该选项使程序执行到光标所在行首先将光标移到某行(一般为可执行),选择该功能项,则程序执行到该行的前一行暂停。此时程序处于跟踪调试状态,并有亮条显示在暂停处,此时可以查询变量或表达式的值。(2)Trace into ()执行一条语句或一行暂停此时程序处于跟踪调试状态,并有亮条显示在暂停处。该选项可跟踪到被调函数的内部。(3)Step over ()执行一条语句或一行暂停此时程序处于跟踪调试状态,并有亮条显示在暂停处。该选项将自定义函数当作一个语句执行,不跟踪到函程序的内部。(4)Debug 菜单程序处于跟踪状态时
9、,可使用该菜单的选项。其主要是使用Evaluate目的是查询或更新变量或表达式的值。选择Evaluate功能后,系统弹出一个对话框。该对话框包含三个选项区域:Evaluate域可以输入一个含有目前代码中(程序暂停区的作用域)正在使用的变量名、或含变量的表达式、或常量表达式。按回车键后,在Result域中显示变量或表达式的值。还可以用New value域进行调试。如果调试程序时发现Result域显示的某变量或表达式的值不正确,并能估计出该变量或表达式的值,则可以将该值输入到New value域,继续执行程序,其目的是肯定错误发生处是否在当前位置之前。如果输入这个正确的值并将程序继续执行完毕而结果
10、正确,说明在目前暂停处之前已经发生错误而之后无错误。(5)Break/Watch用于设置断点和监视表达式。选择Add Watch功能选项,系统将弹出一个菜单,在Add Watch框中输入变量名或表达式,按回车键后,系统在屏幕底部开辟一个窗口并显示 该变量或表达式的值。otanargumentinfunctionsum该标识符不是函数的参数2.arrayboundsmissinginfunctionmain缺少数组界限符3.Arraysizetoolargeinfunctionmain数组规模太大4.badfilenameformatinincludedirective在包含指令中的文件名格式不
11、正确.5.Callofnon-functioninfunctionmain调用未经过定义的函数.6.cannotmodifyaconstobjectinfunctionmain对常量不能进行修改.7.characterconstanttoolonginfunctionmain字符常量太大8.constantexpressionrequiredinfuntionmain数组定义的时候,数组大小要求是常数poundstatmentmissinginfunctionmain复合语句漏掉符号10.declarationsyntaxerrorinfunctionmain宣告语法错误11.expressi
12、onsyntaxinfunctionmain表达式语法错误12.extraparameterincalltosuminfunction调用函数时使用了过多的参数13.illegaluseoffloatingpointinfunctionmain浮点数的不合法使用14.illegalpiontersubtractioninfunctionmain不合法的指针相减15.invalidpointeradditioninfunctionmain无效的指针相加16.outofmemoryinfunctionmain内存不足17.statementmissing;infunctionmain语句后面漏掉分
13、号.警告报错1.kisassignedavaluewhichisneverused定义了一个变量,但程序从来没用过2.possibiyincorrectassignmentinfunctionmain这样的赋值可能不正确3.suspiciouspointerconversioninfunctionmain可疑的指针转换4.codehasnoeffectinfuntionmain代码对程序没效果Ambiguousoperatorsneedparentheses:不明确的运算需要用括号括起Ambiguoussymbolxxx:不明确的符号Argumentlistsyntaxerror:参数表语法错
14、误Arrayboundsmissing:丢失数组界限符Arraysizetoolarge:数组尺寸太大Badcharacterinparamenters:参数中有不适当的字符Badfilenameformatinincludedirective:包含命令中文件名格式不正确Badifdefdirectivesynatax:编译预处理ifdef有语法错Badundefdirectivesyntax:编译预处理undef有语法错Bitfieldtoolarge:位字段太长Callofnon-function:调用未定义的函数Calltofunctionwithnoprototype:调用函数时没有函
15、数的说明Cannotmodifyaconstobject:不允许修改常量对象Caseoutsideofswitch:漏掉了case语句Casesyntaxerror:Case语法错误Codehasnoeffect:代码不可述不可能执行到Compoundstatementmissing:分程序漏掉Conflictingtypemodifiers:不明确的类型说明符Constantexpressionrequired:要求常量表达式Constantoutofrangeincomparison:在比较中常量超出范围Conversionmaylosesignificantdigits:转换时会丢失意义
16、的数字Conversionofnearpointernotallowed:不允许转换近指针Couldnotfindfilexxx:找不到XXX文件Declarationmissing;:说明缺少;Declarationsyntaxerror:说明中出现语法错误Defaultoutsideofswitch:Default出现在switch语句之外Definedirectiveneedsanidentifier:定义编译预处理需要标识符Divisionbyzero:用零作除数Dostatementmusthavewhile:Do-while语句中缺少while部分Enumsyntaxerror:枚
17、举类型语法错误Enumerationconstantsyntaxerror:枚举常数语法错误Errordirective:xxx:错误的编译预处理命令Errorwritingoutputfile:写输出文件错误Expressionsyntaxerror:表达式语法错误Extraparameterincall:调用时出现多余错误Filenametoolong:文件名太长Functioncallmissing):函数调用缺少右括号Fuctiondefinitionoutofplace:函数定义位置错误Fuctionshouldreturnavalue:函数必需返回一个值Gotostatementm
18、issinglabel:Goto语句没有标号Hexadecimaloroctalconstanttoolarge:16进制或8进制常数太大Illegalcharacterx:非法字符xIllegalinitialization:非法的初始化Illegaloctaldigit:非法的8进制数字Illegalpointersubtraction:非法的指针相减Illegalstructureoperation:非法的结构体操作Illegaluseoffloatingpoint:非法的浮点运算Illegaluseofpointer:指针使用非法Improperuseofatypedefsymbol:
19、类型定义符号使用不恰当In-lineassemblynotallowed:不允许使用行间汇编Incompatiblestorageclass:存储类别不相容Incompatibletypeconversion:不相容的类型转换Incorrectnumberformat:错误的数据格式IncorrectuseofdefaultDefault使用不当Invalidindirection无效的间接运算Invalidpointeraddition指针相加无效Irreducibleexpressiontree无法执行的表达式运算Lvaluerequired需要逻辑值0或非0值Macroarguments
20、yntaxerror宏参数语法错误Macroexpansiontoolong宏的扩展以后太长Mismatchednumberofparametersindefinition定义中参数个数不匹配Misplacedbreak此处不应出现break语句Misplacedcontinue此处不应出现continue语句Misplaceddecimalpoint此处不应出现小数点Misplacedelifdirective不应编译预处理elifMisplacedelse此处不应出现elseMisplacedelsedirective此处不应出现编译预处理elseMisplacedendifdirecti
21、ve此处不应出现编译预处理endifMustbeaddressable必须是可以编址的Musttakeaddressofmemorylocation必须存储定位的地址Nodeclarationforfunctionxxx没有函数xxx的说明Nostack缺少堆栈Notypeinformation没有类型信息Non-portablepointerassignment不可移动的指针(地址常数)赋值Non-portablepointercomparison不可移动的指针(地址常数)比较Non-portablepointerconversion不可移动的指针(地址常数)转换Notavalidexpre
22、ssionformattype不合法的表达式格式Notanallowedtype不允许使用的类型Numericconstanttoolarge数值常太大Outofmemory内存不够用Parameterxxxisneverused能数xxx没有用到Pointerrequiredonleftsideof-符号-的左边必须是指针Possibleuseofxxxbeforedefinition在定义之前就使用了xxx(警告)Possiblyincorrectassignment赋值可能不正确Redeclarationofxxx重复定义了xxxRedefinitionofxxxisnotidentic
23、alxx的两次定义不一致Registerallocationfailure寄存器定址失败Repeatcountneedsanlvalue重复计数需要逻辑值Sizeofstructureorarraynotknown结构体或数给大小不确定Statementmissing;语句后缺少;StructureorunionsyntaxerrorX构体或联合体语法错误Structuresizetoolarge结构体尺寸太大Subscriptingmissing下标缺少右方括号Superfluous&withfunctionorarray函数或数组中有多余的&Suspiciouspointerconvers
24、ion可疑的指针转换Symbollimitexceeded符号超限Toofewparametersincall函数调用时的实参少于函数的参数不ToomanydefaultcasesDefault太多(switch语句中一个)Toomanyerrororwarningmessages错误或警告信息太多Toomanytypeindeclaration说明中类型太多Toomuchautomemoryinfunction函数用到的局部存储太多Toomuchglobaldatadefinedinfile文件中全局数据太多Twoconsecutivedots两个连续的句点Typemismatchinpar
25、ameterxxx数xxx类型不匹配Typemismatchinredeclarationofxxxxx重定义的类型不匹配Unabletocreateoutputfilexxx无法建立输出文件xxxUnabletoopenincludefilexxx无法打开被包含的文件xxxUnabletoopeninputfilexxx无法打开输入文件xxxUndefinedlabelxxx没有定义的标号xxxUndefinedstructurexxx没有定义的结构xxxUndefinedsymbolxxx没有定义的符号xxxUnexpectedendoffileincommentstartedonline
26、xxx从xxx行开始的注解尚未结束文件不能结束Unexpectedendoffileinconditionalstartedonlinexxx从xxx开始的条件语句尚未结束文件不能结束Unknownassembleinstruction未知的汇编结构Unknownoption未知的操作Unknownpreprocessordirective:xxx不认识的预处理命令xxxUnreachablecode无路可达的代码Unterminatedstringorcharacterconstant字符串缺少引号Userbreak用户强行中断了程序Voidfunctionsmaynotreturnaval
27、ueVoid类型的函数不应有返回值Wrongnumberofarguments调用函数的参数数目错xxxnotanargumentxxx不是参数xxxnotpartofstructurexxx不是结构体的一部分xxxstatementmissing(xx语句缺少左括号xxxstatementmissing)xxx语句缺少右括号xxxstatementmissing;xxx缺少分号xxxdeclaredbutneverused说明了xxx但没有使用xxxisassignedavaluewhichisneverused给xxx赋了值但未用过Zerolengthstructure结构体的长度为零C语
28、言常见错误及解决方法一、基础知识和数据类型、表达式1、 拼写错误,尤其是include,main,void,float等词。C语言的32个关键字与基本含义如下:double :声明双精度变量或函数 int: 声明整型变量或函数char :声明字符型变量或函数float:声明浮点型变量或函数void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)auto :声明自动变量 一般不使用 struct:声明结构体变量或函数 break:跳出当前循环 else :条件语句否定分支(与 if 连用) long :声明长整型变量或函数 switch :用于开关语句 case:开关语句分支
29、enum :声明枚举类型 register:声明积存器变量 typedef:用以给数据类型取别名(当然还有其他作用) extern:声明变量是在其他文件正声明(也可以看做是引用变量) return :子程序返回语句(可以带参数,也看不带参数) union:声明联合数据类型 const :声明只读变量 short :声明短整型变量或函数 unsigned:声明无符号类型变量或函数 continue:结束当前循环,开始下一轮循环 for:一种循环语句(可意会不可言传) signed:生命有符号类型变量或函数 default:开关语句中的“其他”分支 goto:无条件跳转语句 sizeof:计算数据
30、类型长度 volatile:说明变量在程序执行中可被隐含地改变 do :循环语句的循环体 while :循环语句的循环条件 static :声明静态变量 if:条件语句2、 ,(),“”不配对。解决这个问题最好的方法就是每当写这些符号的时候就先写成一对,然后再在中间加内容。3、 忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命令写在一行。4、 混淆/和;注释对应的符号是/* */,而转义字符是以开头,除号是/。5、 printf()和scanf()的参数设置有误,主要表现在以下几方面:l 类
31、型不匹配的问题。(例如:有float a=3.5,但输出的时候printf(“a=%d”,a);则屏幕上会显示出a=0.00000或者提示其它运行错误)。基本原则是:float对应%f, int对应%d, char对应%c。l 个数不匹配。无论是哪个函数,都可以有n个参数,第一个永远是“”括起来的内容,表示输出格式。剩下的n-1个是输出的变量或者输入的变量的地址。需要注意的是,如果后边有n-1个参数,那么前边一定对应n-1个%f一类的格式说明符。l scanf()中变量前忘了加。记住:scanf()中变量前要有(但后边学到的字符数组名和指针前不用加) 6、 定义标识符的时候经常出现使用非法字符
32、的情况,例如:标识符中不能用空格,也就是说不能有这样的定义:int radium of circle;一般情况下可用下划线将三个单词连接在一起。7、 在使用变量前未定义,或未初始化。例如:若下边的sum未定义,则在编译时会提示相应的错误信息,而若未初始化为0,则求和的结果一定是错误的。void main() int I,a10, sum=0; /*只要下边要用,这个定义就必须要有,一般情况下也要有初始值*/for(I=0;I10;I+) sum+=aI;printf(“%d”,sum);8、 符号常量定义错误。例如:#define PI=3.14159,这里的=应该换成空格。9、 计算错误。主
33、要注意:,和其它运算符一起运算时,除根据优先级进行计算时,还要考虑先后位置的特殊含义;数据类型不一致时发生的自动转换也会导致计算的误差;还要注意求模结果的符号与被除数相同;某些特殊情况下使用懒惰求值法。10、 不能除以0,要做合法性检查;11、 类型溢出。记住每种数据类型的取值范围,确保数据在所定义类型范围之内;12、 数学表达式的格式有误。常见的有:(1)数学与C语言运算表达式的混淆(例如:表示赋值,而= =才表示我们数学中的相等关系)。(2)、忽略了运算的优先级。解决这个问题的最好方法就是写数学表达式时不要从左到右,而是按优先级的顺序写,写完优先级高的一个表达式后加上()再写下一级的表达式
34、,例如:计算梯形的面积时,要s=(a+b)*h)/2,不要1/2*a+b*h. (3)忽略了计算和赋值时的自动转换。例如:float half=1/2;这样,因为右边是整数相除的结果为整数0,不会得到0.5存入half,进而会影响下边的计算结果。要想不在这儿绊跟头,当计算不同类型的数据时,一定注意会不会出现引起错误的自动转换,建议最好加上强制转换。(4)赋值号左边不是变量,例如:若有#define PI 3.14,程序中又出现PI=3.14159。又例如:f(n)=f(n-1)*n(这是典型的数学语言,在C语言中右边的乘积不能正确存储,而左边又是一个函数调用)。13、使用库函数前,尤其是数学函
35、数忘了加#include。二、流程控制1、 丢掉语句结束标记“;”,尤其是for语句中表达式后或do-while语句后的分号,或在预处理命令后边、while()后、for()后加“;”;2、 If语句或循环语句中逻辑表达式或关系表达式书写错误。一定要注意C语言的条件与数学表达式的区别(例如我们数学中经常写到的0x9,在C语言中应该写成x=0&x=9)。3、 if-else嵌套时不配对。最好在写每个条件时要用两个分别将两个分支先括起来,再添加其中的语句,以保证其配对不易错。4、 switch()语句中的格式不正确。()中的表达式结果一定是一些明确的值,不能是区间;表达式的所有可能结果要列在cas
36、e后边,case与常量之间有一空格,不要丢掉必要的break;5、 随意修改循环控制变量i的值,导致循环次数的改变,尤其是当循环有嵌套时。在循环体中,不要将循环控制变量进行另外的改变。6、 分不清什么情况下用双重循环,什么情况下用两个控制变量写成一重循环。当I不变,j又循环一遍的时候用双重循环。当I,j同时变化的时候用一重循环,此时,循环控制变量有两个,但条件只写一个就可以,因为另一个总是进行相应的变化的。7、 忽略循环体与循环控制变量的关系。其实,很多情况下,循环控制变量都在循环体中起到非常重要的作用。应该利用上这种关系。三、数组与指针1、 字符串的输入有错误:主要表现在使用scanf()或
37、gets()时加了,或输入字符串时用循环,(这样的话,字符个数无论多长,都不会为自动加0,将来引用的时候也就不能以字符串的形式引用。)2、 对字符串的处理中,循环条件仍然写成IN。由于字符串是不定长的,所以循环条件一般为strI!=0 或Istrlen(str)3、 而输入所对应的变量是指针时(常见的有:输入的变量是字符数组名或指向字符串的指针)不能加。4、 指针定义后未赋值就引用。如果在定义时不知道赋什么值,可以用p=NULL赋初值,以避免引起的灾难性错误。5、 分不清p和p。前者是指针,即地址,后者表示指针所间接引用的数据,但如果是二级指针或多级指针,取*以后得到的仍然可能是地址。四、函数
38、1、 函数定义的时候,函数头部加分号,而函数声明的地方忘了加分号2、 函数实参格式不对,主要表现在:给出实参时,多给出数组类型,或者,形参是数组int a;的时候,给出的a或aI.3、 递归时忘了设置边界条件,这样易造成死循环调用。4、 使用函数之前未声明(包括C库函数的声明)。建议大家,将所定义的一切函数都在程序开始的预处理命令后加上函数原型的声明,这样做不仅可以避免错误,而且整个程序的结构看起来更清楚。五、结构体共用体1、 结构体类型定义有误,主要表现在:结构体类型里还有嵌套的时候,忘记了成员名称。(例如:下边的例子中,有些同学经常忽略了birthday)2、 结构体类型名和结构体变量名混
39、淆。例如:struct STU .Struct dataint year,month,day;birthday;struct STU a; struct STU是类型名称,而且不分配空间,且不能直接引用。只有定义了结构体类型struct STU的变量a以后,才为a分配相应的内存空间,引用时也要是a.?3、 结构体变量的成员引用不正确,尤其是当结构体类型中有嵌套定义的时候。一定要一级一级的引用。例如:上边的例子:如果引用其中的年的话,一定是a.birthday.year.不能直接a.year.4、 对结构体变量进行输入输出的时候,整体输入或整体输出。除作为函数参数外,不能对结构体变量整体操作,只能一个成员一个成员地输入、输出。5、 不理解共用体的“共占内存”。对共用体中的成员变量,一定要靠一个标记区别它们,并分别按不同类型引用它们。切记:共用体变量不能做函数形参。六、文件1、 使用之前没有打开文件,使用之后没有关闭文件。2、 相关函数的调用格式有误。请一定注意实参的类型、顺序、个数上与函数原型(或函数声明)的一致。