Visual C++6.0中的调试工具使用及常见错误

上传人:d**** 文档编号:144149144 上传时间:2022-08-26 格式:DOCX 页数:11 大小:465.39KB
收藏 版权申诉 举报 下载
Visual C++6.0中的调试工具使用及常见错误_第1页
第1页 / 共11页
Visual C++6.0中的调试工具使用及常见错误_第2页
第2页 / 共11页
Visual C++6.0中的调试工具使用及常见错误_第3页
第3页 / 共11页
资源描述:

《Visual C++6.0中的调试工具使用及常见错误》由会员分享,可在线阅读,更多相关《Visual C++6.0中的调试工具使用及常见错误(11页珍藏版)》请在装配图网上搜索。

1、C语言常见错误及解决方法(注:红色粗体是常见的错误,请人家检查自己的程序,并注意尽屋不要犯这些常见的错误。 其余它体是避免错误的方法和正确的写法)一、基础知识和数据类型、表达式1、拼写错误,尤其是include,main,void,float等词。C语言的32个关键字与基本含义如下:double :声明双精度变量或函数mt:声明整型变量或函数char :声明字符型变量或函数float:声明浮点型变量或函数void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)auto :声明自动变量一般不使用stmct:声明结构体变量或函数break:跳出当前循环else :条件语句否定分支

2、(与if连用)long :声明长整型变量或函数switch :用于开关语句case:开关语句分支enum :声明枚举类型register:声明积存器变量typedef:用以给数据类型取别名(当然还有其他作用) extern:声明变量是在其他文件正声明(也可以看做是引用变量) i-etuin :子程序返回语句(可以带参数,也看不带参数) union:声明联合数据类型 const :声明只读变量 shoit :声明短整型变量或函数 unsigned:声明无符号类型变量或函数 continue:结束当前循坏,开始下一轮循环 for: 一种循坏语句(可意会不可言传) signed:生命有符号类型变量或

3、函数 default:开关语句中的“其他”分支 goto:无条件跳转语句 sizeof:计算数据类型长度volatile:说明变屋在程序执行中可被隐含地改变do :循环语句的循坏体while :循环语句的循坏条件static :声明静态变量if:条件语句2、,”不配对。解决这个问题最好的方法就是每当写这些符号的时候就 先写成一对,然后再在中间加内容。3、忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要 加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命令写在一行。4、混淆/和;注释对应的符号是/*忆而转义字符是以开头,除号是/。5、prin

4、tfO和scanf()的参数设置有课,主要表现在以下几方面: 类型不匹配的问题。(例如:有float a=3.5,fi输出的时候printf(“a=%d”,a);则屏幕上会 显示出a=0.00000或者提示其它运行错误)。基本原则是:float对应 mt对应出char 对应6 个数不匹配。无论是哪个函数,都可以有n个参数,第一个永远是“”括起来的内容, 表示输出格式。剩下的n-1个是输出的变量或者输入的变量的地址。需要注意的是,如 果后边有ml个参数,那么前边一定对应ml个彳一类的格式说明符。 scanfO中变量前忘了加&。记住:scaiif()中变量前要有&(但后边学到的字符数组名和指 针前

5、不用加)6、定义标识符的时候经常出现使用非法字符的情况,例如:标识符中不能用空格,也就是 说不能有这样的定义:iiit radium of circle;般情况下可用下划线将三个单词连接在一 起。7、在使用变量前未定义,或未初始化。例如:若下边的sum未定义,则在编译时会提示相 应的错误信息,而若未初始化为0,则求和的结果一定是错误的。void niaiii()iiitI,a10, sum=0;/*只要卜边要用,这个定义就必须要有,一般情况卜也要行初始值*/for(I=0;I类型溢出。记住每种数据类型的取值范围,确保数据在所定义类型范用之内:12、数学表达式的格式有误。常见的有: 数学与C语言

6、运算表达式的混淆(例如: =表示赋值,而=才表示我们数学中的相等关系)。(2)、忽略了运算的优先级解决 这个问题的最好方法就是写数学表达式时不要从左到右,而是按优先级的顺序写,写完 优先级高的一个表达式后加上()再写下一级的表达式,例如:计算梯形的面积时,要 s=(a+b)*h)/2,不要l/2*a+b*h.忽略了计算和赋值时的自动转换。例如:float half=l/2; 这样,因为=右边是整数相除的结果为整数0,不会得到0.5存入half,进而会影响下边 的计算结果。要想不在这儿绊跟头,当计算不同类型的数据时,一定注意会不会出现引 起错误的自动转换,建议最好加上强制转换。(4)赋值号左边不

7、是变量,例如:若#defme PI 3.14,程序中又出现PI=3.14159。又例如:f(n)=f(n-l)*n 这是典型的数学语言,在C 语言中右边的乘积不能正确存储,而左边又是一个函数调用)。13、使用库函数前,尤其是数学函数忘了加#include.二、流程控制1、丢掉语句结束标记“;”,尤其是For语句中表达式后或do-while语句后的分号,或在预 处理命令后边、while。后、for()后加“;”;2、If语句或循环语句中逻辑表达式或关系表达式书写错误。一定要注意C语言的条件与数 学表达式的区别(例如我们数学中经常写到的0WxW9、在C语言中应该写成x=0&x=9)o3、if-el

8、se嵌套时不配对。最好在写每个条件时要用两个分别将两个分支先括起来,再 添加其中的语句,以保证其配对不易错。4、switch!)语句中的格式不正确。()中的表达式结呆一定是一些明确的值,不能是区间; 表达式的所有可能结果要列在case后边,case与常量之间有一空格,不要丢掉必要的 break;5、随意修改循环控制变量i的值,导致循环次数的改变,尤其是当循环有嵌套时。在循坏 体中,不要将循坏控制变量进行另外的改变。6、分不清什么情况下用双重循环,什么情况下用两个控制变量写成一重循环。当I不变,J又循坏一遍的时候用双重循环。当I,J同时变化的时候用一重循坏,此时,循坏控制变 量有两个,但条件只写

9、一个就可以,因为另一个总是进行相应的变化的。7、忽略循环体与循环控制变量的关系。其实,很多情况卜,循环控制变量都在循坏体中起 到非常重要的作用。应该利用上这种关系。三、数组与指针1、字符串的输入有错误:主要表现在使用scanf(威gets()时加了&,或输入字符串时用循 环,(这样的话,字符个数无论多长,都不会为自动加0,将来引用的时候也就不能以 字符串的形式引用。)2、对字符串的处理中,循环条件仍然写成IvN。由于字符串是不定长的,所以循坏条件一 般为 strI!=0 或 Istilen(sU)3、而输入所对应的变量是指针时(常见的有:输入的变量是字符数组名或指向字符串的指 针)不能加&。4

10、、指针定义后未赋值就引用如杲在定义时不知道赋什么值,可以用p=NULL赋初值,以 避免引起的灾难性错误。5、分不清卩和*卩。前者是指针,即地址,后者表示指针所间接引用的数据,但如果是二 级指针或多级指针,取*以后得到的仍然可能是地址。四、函数1、函数定义的时候,函数头部加分号,而函数声明的地方忘了加分号2、函数实参格式不对,主要表现在:给出实参时,多给出数组类型,或者,形参是数组int 丸;的时候,给出的a或aI3、递归时忘了设置边界条件,这样易造成死循环调用。4、使用函数之前未声明(包括C库函数的声明)。建议人家,将所定义的一切函数都在程 序开始的预处理命令后加上函数原型的声明,这样做不仅可

11、以避免错误,而且整个程序的结 构看起来更清楚。五、结构体共用体1、结构体类型定义有误,主要表现在:结构体类型里还有嵌套的时候,忘记了成员名称。(例如:下边的例子中,有些同学经常忽略了 birthday)2、结构体类型名和结构体变量名混淆。例如:struct STU.Stmct dataiiit yeaianonth.day;birthday;stiuct STU a; stnict STU是类型名称,而且不分配空间,且不能直接引用。只有定义了结 构体类型suuct STU的变量a以后,才为a分配相应的内存空间,引用时也要是a.?3、结构体变量的成员引用不正确,尤其是当结构体类型中有嵌套定义的时

12、候,一定要一级 一级的引用。例如:上边的例子:如果引用其中的年的话,一定是a.biitliday.yeai.不 能直接a.veai.4、对结构体变量进行输入输出的时候,整体输入或整体输出。除作为函数参数外,不能对 结构体变量整体操作,只能一个成员一个成员地输入、输出。5、不理解共用体的“共占内存”。对共用体中的成员变量,一定要靠一个标记区别它们, 并分别按不同类型引用它们。切记:共用体变量不能做函数形参。六、文件1、使用之前没有打开文件,使用之后没有关闭文件。2、相关函数的调用格式有误。请一定注意实参的类型、顺序、个数上与函数原型(或函数 声明)的一致。Visual C+6.0中的调试工具使用

13、入门一、程序开发过程中出现的错误类型我们在进行程序设计时,不可避免地会犯错误。程序中的错误可以分为三类:编译错误、 运行时错误和逻辑错误。编译错误(Compile errors)又称为编译时错误(Compiling-time errors):是由于 错误的编码产生的。例如关键字拼写错误、将中文标点符号当成英文符号使用、遗漏了某些 必要的标点符号或者使用了一个没有定义的标识符。编译错误一般都是语法错误,当编译器对程序进行语法检查时,都能发现这些错误,并 能够指出产生错误的位置(标出行号)。我们可以根据编译出错信息指出的行号找到对应的 源代码行改正错误,重新编译源程序。只有当所有的编译错误被改正后

14、,才能通过编译检查, 产生目标代码文件。改正编译错误的关键是要能正确理解编译器给出的编译错误信息。VC卄坏境中的编译、 链接错误信息是用英文表示的。对于英文基础薄弱的读者,可以参考本实验指导书后面的 “VC+编译、链接常见错误和警告信息中英文对照”。通常情况下,一个语法错误可能产生多条编译错误信息,这是由于株连错误造成的,建 议读者在处理编译错误时,找到第一个出现错误的位置改正后重新编译。这样能够避免被株 连错误迷惑。值得指出的是,现在人部分编译器对错误的定位不精确,如果在编译器指出的 行没有发现错误,应该向前查找错误。例如,当提示第10行发生错误时,如果在第10行没 有发现错误,请从第10行

15、开始往前查找错误并修改之。运行时错误(Run-time errors)是在程序的运行阶段出现的,当运行坏境检测到程序 的某些操作无法执行,例如除数为零时,就会出现运行时错误。当运行环境检测到程序的某 些操作是被禁止的,也会产生运行时错误。例如,访问数组时超越数组的边界,空指针引用 (NULL pomter assigmnent,空指针赋值,即有指针未赋具体地址就使用了 )等等。逻辑错误(Logic errors):当程序没有按照程序员的意图执行时,就表明程序中 存在逻辑错误。一个应用程序可能既没有语法错误,运行时也没有执行任何无效的操作,但 是有可能产生错误的结果,这种错误结果一般都是程序内部

16、的逻辑错误造成的。只有通过测 试应用程序并分析它产生的结果,我们才能核实应用程序是否正确地执行了。当然,如果输入了错误的或者无效的数据,执行程序后肯定也得不到正确的结果。软件 行业中有一句名言输入的是垃圾,输出也是垃圾。(Garbage in, garbage out.) ”因此, 一般的实用程序还需要对输入数据的正确性和有效性进行检验。很显然,必须找出并改正程序中的错误,才能得到正确的执行结果。对于语法错误,我 们可以根据编译错误信息指出的位置和错误原因来改正错误。请记住:编译器不能发现程序 中的逻辑错误和运行时错误。我们可以通过仔细阅读源程序来发现逻辑错误,还可以借助开 发环境中提供的调试

17、工具来查找程序中的逻辑错误和运行时错误。所谓调试(debug)就是定位程序中的错误并改正错误的过程。为了帮助程序员找出并 改正程序中的错误,微软公司在Visual C-b+6.0环境中集成了调试器(debugger),调试器就 是调试工具(debugging tools)o卜面我们将介绍Visual C+6.0中的调试工具及其使用方法。二、Visual C+6.0中的调试工具简介Visual C+6.0环境中的调试工具功能十分强人,既可以支持C卄语言源代码级的调试, 也可以支持汇编语言级和机器语言级的调试。我们在此仅介绍C卄语言源代码级的调试。 Visual C+6.0中的调试器允许我们在程序

18、中设置断点(breakpoint),单步运行程序(step), 运行到光标处(run to cursor),监视(watch变量值等等。断点是我们通过调试器在源程序中设置的一个位置。当运行到断点时,程序中断执行, 这样我们可以观察断点处各个相关变量的值,通过变屋的值分析、判断到断点处时程序的执 行是否符合我们的期望。断点是最常用、最基本的技巧。在Visual C+6.0中设置断点的最 简单方法就是通过点击Budd I具条上的插入断点按钮(手掌形状按钮)或者按键盘上的功 能键F9。如图13所示,图13在源程序中设置断点图14开始调试程序一次可以设置多个断点,设置了断点之后,就可以通过点击Buil

19、d工具条上的开始调试 程序按钮或者按键盘上的功能键F5开始调试程序。如图14所示,0 Lilc Idit 幻er Insert project fiebuc lools fi;jndcnr ifelptn fsw 钿 a b;1F(D = 0)return -1; c = a / b; cout “C” ArpLf CodeIntoX】护 Step QvernoP Stop OutShif匕打“0弋 Kg to CursorCtrl+yNLStep late Specific幸 ZKcepti ods.Itjreads .Hoddlas .0 Shoiv gezt St at ar.antAl

20、t+Uun x歸时 ckYatcK .Shi 井?9FSClrUShi 卩肉Shi EWF5Robu 如 ng尽|輕吐运行到光标处单步运行,可以进入函数内部从当前函数调用中 出来return 0;2I Ln 12, Col 1 【RFC |COIStups into Ihu nuxt shilumunt图16单步运行每次单步运行一条语句后,都可以通过Watch (监视)窗II观察有关变量的值,或者将 鼠标光标移动到源程序中的某个需要观察的变屋上,停留一秒钟就可以看到这个变量的值, 如图17所示。如果我们确认当前函数中没有错误时,可以使用Step Out命令快速地执行完毕当前的函 数,暂停在该函

21、数调用的下一条语句上。如果我们确认某一段源代码中没有错误时,可以将键盘光标(插入符)放置在这段代码 的末尾处,使用Run to Cursor (运行到光标处)命令快速地执行完毕这一段代码,暂停在光 标所在语句上。例如我们可以将键盘光标移动到main函数的结尾处,然后按功能键Ctil+F10 执行Run to Cursor命令。这样程序将运行到结束处停止。住)Filo dit Vav bizcrt Iroj act Dbug: goo Wando*1 Hdp. |少 X亘空口0庄野脳d 31皑雨曽皆-|(GloboIs)jt|(AII global members | moin二毂 辔幽 基!圄

22、1 也图17单步运行后观察相关变量的值需要停止调试程序时,可以执行Stop Debuggmg (停止调试)命令,如图18所示。Stop Debuggmg命令的快捷键是功能键Sluft+F5, Restart (重新开始调试程序)命令的快捷键是 功能键Cul+Sluft+F5o Go (开始调试程序)命令的快捷键是功能键F5。Go命令还可以使程序从当前语句运行到下一个断点处,如杲后面没有断点,就运行到 到程序的结尾。除了使用快捷键和Debug (调试)菜单执行调试命令,还可以使用Debug工具条,如 图19所示。使用工具条上的QuickWatch可以添加要观察的变量或者表达式。工具条上还有 一些

23、其他工具可以帮助我们查看CPU内部的寄存器(Registers)、内存单元(Memoiy)和 堆栈(Stack)的情况。Visual C+.0中的调试工具功能强大,在这里我们只介绍最基本的操作。当读者积累 了一定的调试经验后可以继续学习调试工具的高级使用方法。最后要强调一点,当程序员对程序进行调试时,一定要理解程序的算法,熟悉程序的结 构和流程,准确估计变量和表达式的期望值。这样才能做出正确的分析和判断。调试的过程 实质上是一个思考的过程。图18停止调试命令等图19调试工具条VC+编译、链接常见错误和警告信息中英文对1、fatal error C1010: unexpected end of

24、file while looking for pieconipiled header directive。寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有include stdafx.h)2、fatal erroi C1083: Cannot open include file: fR.h*: No such file or duectoiy不能打开包含文件“R.h”:没有这样的文件或目录。3、enor C2011: C class type redefinition类“c”重复定义。4、enor C2018: unknown chaiacter *0xa3不认识的字符*0x33-0

25、 (一般是汉字或中文标点符号)5、error C2057: expected constant expression希望是常量表达式。(一般出现在switch语句的case分支中)6、enor C2065: EDD_MYDIALOG : undeclared identifier“IDD_MYDIALOG”:未声明过的标识符。7、error C2082: redefinition of formal paiameter bRes亡f函数参数“bReset”在函数体中重定义。8 v enor C2143: syntax error: nussmg 1 before * 句法错误:“”前缺少“:”

26、。9、error C2146: syntax enor : missing before identifier句法错误:在“de”前丢了 “; ”。10、enor C2196: case value 69 akeadv used值69已经用过。(一般出现在switch语句的case分支中)11、enor C2509: OnTimef : member function not declared in HelloView1成员函数“OnTimer”没有在CHelloView”中声明。12、enor C2511: Tesef: overloaded member function void (in

27、t)* not found in B*重载的函数“voidreset(mt)”在类“E”中找不到。13、enor C2555:overndmg viitual fiinction differs fiom fA:flr only by return type orcallmg convention类B对类A中同名函数fl的重载仅根据返回值或调用约定上的区别。14、enor C2660: SetTimer1 : fiinction does not take 2 paiaineters “SetTimei函数不传递 2 个 参数。15、 warning C4035: *fno return va

28、lue f-” 函数 f没有返回值。16、warning C4553: - =: operator has no effect; did you intend没有效果的运算符“=”;是否改为“=”?17、warning C4700: local variable *bReset used without having been mitialized局部变量“bReset”没有初始化就使用。18、enor C4716: CMyApp:litliistaiice*: must return a value“ CMyApp:IiutInstanceM函数必须返回一个值。19、LINK : fatal enor LNK1168: cannot open D亡bug/Pl.exe for writing连接错误:不能打开Pl.exe文件,以改写内容。(一般是Pl.Exe还在运行,未关闭)20、enor LNK2001: umesolved external symbolnM连接时发现没有实现的外部符号(没有定义的变量、没有定义的函数等)。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!