《数据结构》上机常见问题0609.docx
《《数据结构》上机常见问题0609.docx》由会员分享,可在线阅读,更多相关《《数据结构》上机常见问题0609.docx(8页珍藏版)》请在冰豆网上搜索。
《数据结构》上机常见问题0609
《数据结构》上机常见问题
数据结构实验对上机环境没有统一的要求。
目前我们机房安装有的环境有TC30和VC6.0。
TC30界面还是传统的DOS环境,界面简单、易用,系统程序本身占用空间小,安装方便,编译连接过的可执行文件较小;而VC60是基于图形操作界面的,界面丰富,操作选择较多,编译连接过的可执行文件能在windows环境下运行,文件较大。
对于数据结构实验来说,这两种环境都可以用,而且绝大部分程序可在这两种环境下通用,而且常见的语法问题也是类似的。
针对我们现在数据结构实验的要求,重点是熟悉和加强对数据结构课堂教学中常用算法的理解、大型程序设计的初步训练以及算法分析,所以习惯上使用TC30就能满足需要了。
这里主要针对TC30介绍C语言或C++调试过程中的常见问题。
一.TC30的运行环境
TC30与其他任何高级语言环境一样,是集编辑、编译、运行、调试功能为一体的集成环境(IDE)。
在运行时除了需要正确书写程序代码外,环境还必须正确。
我们现在使用的教科书是采用类C编写的,基本属于C++的程序框架,改写成C++程序时改动较小。
在TC30环境下调试程序时应注意以下两个主要问题:
(1)TC30默认的文件扩展名是.cpp,即C++的程序。
在调试程序
时,使用printf(),scanf()等标准输入输出时,函数库“stdio.h”
包含不能省。
如果使用cin、cout等文件流输入输出方式时,
则必须包含“iostream.h”
(2)一般机房的运行环境都是一台机器上安装好后复制过去的,
所以有可能出现系统默认的环境设置与实际路径不一致,出
现最多的是找不到包括文件和库文件。
如在调试过程中出现
如下:
Unabletoopenincludefile“stdio.h”(或“iostream.h”)
时表示你的运行环境可以不一致。
此时,首先查找并确认你
的包含文件与库文件的位置,并在IDE的主菜单Options中找
开Directories…子菜单,在出来的”Directories”对话框中,修
改:
IncludeDirectories下的包含文件所在的目录和Library
Directories下的库文件所在目录,然后按OK确认。
-1-
注意,为了使该修改下次继续有效,可以在主菜单Options下
选择Save…。
二.语法错误但在编译时不显示的常见问题:
由于C/C++语言是一种高效的程序设计语言,但它是以牺牲部分语法检查为代价的,尤其是以下几种情况,我们在写程序时要注意:
(1)格式化方式输入数据时普通变量名前面没有取地址符:
&
(2)格式化方式输入字符串时字符数组名就表示地址,不需要再加&而加了导致的错误
(3)数组越界。
注意C/C++语言是不检查越界问题的,程序的正确性由程序员自己来保证
(4)在使用格式化输入/输出函数时,相关的数据与格式字符必须严格一致。
尤其要注意字符与字符串输入时的格式。
参见有关教材的详细说明
(5)指针定义后必须赋值后才能使用,不能使用悬空的指针
(6)引用参数与指针作为参数问题
(7)变量的作用域,尤其是全局变量与局部变量,动态变量与局部静态变量
三.如何调试程序?
跟踪调试是一种有效的调试程序的方法,是一种通过人工控制程序执行过程,比对主观和客观的程序执行过程和中间结果以发现和改正错误的调试程序的方法。
在程序编译没有问题,但运行结果不对时尤其有效。
在TC环境中是通过Run和Debug菜单中的命令实现跟踪调试的。
Debug菜单:
Togglebreakpoin(tCtrl-F8):
删除或设置断点
BreakPoints.…:
断点设置情况的观察
Addwatch(Ctrl-F7):
增加监视表达式
Deletewatch:
删除监视表达式
Editwatch:
编辑监视表达式
Removeallwatches:
删除所有监视表达式
●Run菜单:
Traceinto(进入跟踪)(F7):
逐行运行程序,遇到函数调用语句
时,进入到被调用函数继续跟踪
执行。
stepover(单步执行)(F8):
逐行运行程序,遇到函数调用语句时,
运行完被调用函数而不进入跟
踪。
●跟踪方法
一边使用Traceinto(F7)或stepove(F8)命令跟踪控制程序的执行,一般在观察窗口(Watch)(如果该观察没有出来,可以按F6切换)监视某些变量的值与主观预期的是否一致,出现不一致的地方查找产生不一致的原因,以便找出程序中的错误。
在跟踪调试的过程中注意以下问题:
(1)已经调试正确的地方可以设置断点,不需要所有的程序每次
都一行一行执行。
(2)设置断点的方法是:
把光标移到要设置断点的地方,使用
Togglebreakpoint(Ctrl-F8)命令
(3)可以先用stepove(F8)命令跟踪调试,发现有不正确的地方在
重新用Traceinto(F7)调试。
(4)程序调试的一般思路是:
先检查输入数据是否正确,再检查
每个函数是否正确。
可以分块分段的调试。
四.常见错误
一个再有经验的程序员在编写完程序后,也不可能保证百分百完全正确,我们通过上机调试就是要通过练习快速发现错误并改正过来。
我们在调试过程中,一定要注意总结,一样的错误出现一次、两次是正常的,但不要出现第三次。
以下是我们在调试过程常见的一些错误及分析与处理分析,供大家参考:
●Callofnon-functin(调用未定义函数)
分析与处理:
被调用的函数无定义,可能是由于不正确的函数声明或函数名拼错而造成。
●caseoutsideofswitch(case出现在switch外)
分析与处理:
case语句出现在switch语句之外,可能是括号不匹配。
●casestatementmissing(case语句漏掉)
分析与处理:
case语必须包含一个以冒号结束的常量表达式。
●Characterconstanttoolong(字符常量太长)
原因:
字符常量的长度通常只能是一个或两个字符长。
●Compoundstatementmissing(漏掉复合语句)
分析与处理:
编译程序扫描到源文件未时,未发现结束符号(大括号),可能是由于大括号不匹配所致。
●Conflictingtypemodifiers(类型修饰符冲突)
分析与处理:
对同一指针,只能指定一种变址修饰符(如near或far);而对于同一函数,也只能给出一种语言修饰符(如Cdecl、pascal或interrupt)。
●Constantexpressionrequired(需要常量表达式)
分析与处理:
数组的大小必须是常量。
●Couldnotfindfile'xxxx.xxx'(找不到'xxxx.xx'文件)
分析与处理:
编译程序找不到命令行上给出的文件。
●Declarationmissing(漏掉了说明)
分析与处理:
源文件中包含了一个struct或union域声明,而后面漏掉了分号。
●Declarationneedstypeorstorageclass(说明必须给出类型
或存储类)
分析与处理:
正确的变量说明必须指出变量类型,否则会出现此类错误。
●Declarationsyntaxerror(说明出现语法错误)
分析与处理:
在源文件中,若某个说明丢失了某些符号或输入多余的符号,则会出现此类错误。
如果错误出现在函数首部,多数情况下是前一个函数的花括弧不匹配。
●Defaultoutsideofswitch(Default语句在switch语句外出现)
分析与处理:
这类错误通常是由于括号不匹配引起的。
●Definedirectiveneedsanidentifier(Define指令必须有一
个标识符)
分析与处理:
#define后面的第一个非空格符必须是一个标识符。
●Divisionbyzero(除数为零)
分析与处理:
除数中表达式值不能为零。
●Dostatementmusthavewhile(do语句中必须有while关键字)
分析与处理:
源文件中包含了一个无while关键字的do语句。
●DOwhilestatementmissing((dowhile语句中漏掉了符号
"(")
分析与处理:
在do语句中,若while关键字后无左括号。
●Dowhilestatementmissing;(dowhile语句中掉了分号)
分析与处理:
在do语句的条件表达式中,若右括号后面无分号。
●DuplicateCase(case情况不唯一)
分析与处理:
switch语句的每个case常量表达式值必须个唯一。
●Enumsyntaxerror(Enum语法错误)
分析与处理:
若enum说明的标识符表格式不对。
●Enumerationconstantsyntaxerror(枚举常量语法错误)
分析与处理:
若赋给enum类型变量的表达式值不为常量,则会导致此类错误发生。
●Expressionsyntaxerror(表达式语法错误)
分析与处理:
此类错误通常是由于出现两个连续的操作符、括号不匹配、缺少括号或前一语句漏掉了分号引起的。
●Extraparameterincall(调用时出现多余参数)
分析与处理:
调用函数时,实际参数个数多于函数定义中的参数个数。
●Filenametoolong(文件名太长)
分析与处理:
#include指令给出的文件名太长,致使编译程序无法处理,则会出现此类错误。
通常DOS下的文件名长度不能超过64个字符。
●Forstatementmissing)(for语名缺少")")
分析与处理:
在for语句中,控制表达式后缺少右括号。
●Forstatementmissing((for语句缺少"(")
分析与处理:
在for语句中,控制表达式后缺少左括号。
●Forstatementmissing;(for语句缺少";")
分析与处理:
在for语句中,某个表达式后缺少分号。
●Functioncallmissing)(函数调用缺少")")
分析与处理:
函数调用的参数表漏掉了右手括号或括号不匹配。
●Function‘xxxxx’shouldhavehaveaprototype(函数xxxxx
没有原型)
分析与处理:
函数没有定义或没有声明。
●Ifstatementmissing((if语句缺少"(")
分析与处理:
在if语句中,其表达式后缺少左括号。
●Ifstatementmissing)(if语句缺少")")
分析与处理:
在if语句中,其表达式后缺少右括号。
●Incorrectcommandlineargument:
xxxxxx(不正确的命令行参
数:
xxxxxxx)
分析与处理:
命令行参数的类型或个数与要求不一致。
●Misplacedelse(else位置错)
分析与处理:
else位置错或找不到匹配的if。
●Pointerrequiredonleftsideof(操作符左边须是一指针)
分析与处理:
操作符左边须是一指针。
●Redeclarationof'xxxxxx'('xxxxxx'重定义)
分析与处理:
xxxxxx重复定义了。
●Sizeofstructureorarraynotknown(结构或数组大小不定)
分析与处理:
结构或数组的大小必须是确定的。
●Statementmissing;(语句缺少“;”)
分析与处理:
该语句后缺少分号。
●Subscriptionmissing](下标缺少))
分析与处理:
在使用数组时,元素下标少]。
●Unabletocreatoutputfile'XXXXXXXX.XXX'(不能创建输出
文件'XXXXXXXX.XXX')
分析与处理:
TC运行环境指定的目录不能创建文件。
●Unabletoopenincludefile'xxxxxxx.xxx'(不能打开包含文
件'xxxxxxxx.xxx')
分析与处理:
文件包含中指定的文件不在TC运行环境指定的目录上。
●Undefinedsymbol'xxxxxxx'(符号'xxxxxxxx'未定义)
分析与处理:
变量没有定义。
-6-