简明TurboC上机指导手册.docx
《简明TurboC上机指导手册.docx》由会员分享,可在线阅读,更多相关《简明TurboC上机指导手册.docx(26页珍藏版)》请在冰点文库上搜索。
简明TurboC上机指导手册
第16章简明TurboC3.0上机帮助手册
TurboC3.0(TC)是一个集编辑、编译、链接、调试与一体的集成开发环境,它不仅能够开发标准C程序,也能够开发C++程序。
不过由于TC发布时间太早,仅支持文本用户界面,因而只能在DOS窗口执行。
同时,它支持的C++功能有限。
16.1TurboC3.0上机环境简介
要运行TC环境,在Windows操作系统下进入可执行文件“TC.EXE”所在的目录,双击执行它,Windows操作系统就会自动启动一个“命令提示符”窗口运行TC集成开发环境,如图16-1所示。
图16-1TurboC3.0集成开发环境
整个TC环境有11个菜单,按顺序分别为:
≡FileEditSearchRunCompileDebugProjectOptionsWindowHelp
这些菜单的中文含义分别为:
“系统”、“文件”、“编辑”、“查找”、“运行”、“编译”、“调试”、“工程项目”、“选项”、“窗口”与“帮助”。
更古老的TC版本(例如TurboC2.0)的菜单和相应的菜单项与此可能有差别,不过主要的命令都是有的。
除了最左边的“系统”菜单,其他每个菜单项的第一个字母都是红色大写字符,这表示用户可以使用Alt与该字符构成的组合键进入该菜单,例如对于“File”菜单,用户可以使用Alt+F组合键打开该菜单。
TC界面使用了扩展ASCII字符集,其中绘制边框的字符与Windows的Unicode字符有冲突,窗口边框可能显示的是乱码,好在并不影响程序的正常使用。
运行TC更好的方式是单独使用一台只有DOS操作系统的微机——这显然并不现实,所以读者可以使用诸如VMwareWorkstation之类的虚拟机软件虚拟一个DOS操作系统出来,然后在虚拟机上安装TurboC开发环境。
16.2文件的创建和保存
在进入TC开发环境后,程序员就可以使用“File(文件)”菜单中的“New”菜单项(一般简记为“‘File|New’命令”或“‘File|New’菜单项”)创建一个新的C程序文件,如图16-2所示。
图16-2使用“File|New”命令
缺省情况下,新创建的文件名为“noname00.cpp”这样的文件,具体保存位置为当前目录,例如图16-3种创建的新文件名为“noname00.cpp”,保存目录为“A:
\C\Chap07\Eg0704\”(驱动器盘符被省略了)。
此时程序员就可以在新开的编辑窗口输入C程序源代码了。
图16-3创建新文件
当用户编辑好源文件之后,应该为其起个有意义的名字保存起来。
此时可以通过“File|Save”命令打开“SaveFileAs”对话框(第一次保存文件时,使用“File|Save”命令等价于使用“File|SaveAs”命令),如图16-4所示。
图16-4保存文件
程序员可以在图16-4中的“SaveFileAs”编辑框中输入要保存文件的文件名(可以包含完整或相对路径),在“Files”列表框中选择文件的保存路径,然后单击“OK”按钮保存。
注意,在图16-4显示的对话框底部蓝色区域为待保存文件的当前完整路径信息。
另外,因为TurboC开发环境还可以编译C++程序,所以文件的缺省扩展名为“*.cpp”,在保存文件时,一定要使用“*.c”扩展名,这将保证编译器会按照C语言而不是C++格式编译程序。
C++虽然支持C,但是部分功能并不完全相同,例如const定义的常量不是在C中作为数组元素个数参与数组定义,但在C++中则是允许的。
如果要将文件保存到其他磁盘,则应在“SaveFileAs”编辑框输入该驱动器的盘符和冒号,然后键入回车键,“Files”列表框就会自动显示新驱动器下的目录列表。
如果用户的环境没有鼠标支持,则可以使用Tab键在对话框中切换输入焦点。
或者,使用Alt键加黄色字符直接将输入焦点转移到对应控件处。
例如,如果用户想更改文件名,可以使用Alt+S组合键将输入焦点移动到“SaveFileAs”编辑框,若想更改路径,则可以使用Alt+F更改目录。
在设置完毕后,使用回车键或Alt+K组合键接受输入,使用ESC键取消操作。
一旦用户保存了文件一次,下次保存文件时就可以直接使用“File|Save”命令保存对文件的改动了。
为方便用户的操作,TC环境为很多常用命令定义了快捷键,例如“File|Save”命令对应的快捷键为F2,“File|Open...”命令对应的快捷键为F3,程序员可以在任意窗口使用快捷键执行菜单命令。
此后,一旦用户退出TC再次进入,可以使用“File|Open...”命令打开过去编辑的文件。
如图16-5所示,“OpenaFile”对话框的样子和“SaveFileAs”对话框类似,使用方法也差不多。
图16-5打开文件
注意,在保存和打开文件时,如果使用“*.c”为文件扩展名后缀,程序员需要在文件名编辑框中手工改变扩展名,才能在文件列表框中显示对应类型文件。
注意,C语言本身是区分大小写的语言,但是DOS操作系统确是不区分大小写的操作系统。
因而文件名的大小写对于程序其实没有任何关系。
在包含头文件时也同样,例如包含头文件“STDIO.H”时使用
#include
与
#include
没有什么两样。
不过为了移植性的考虑,不建议大家使用大写字母。
C标准库的缺省文件名都是小写字母的,而部分操作系统确实区分文件名的大小写。
16.3源文件的编辑
对新建立的文件或已存在的文件都可以进行编辑操作。
TC环境提供了强大的文件编辑与查找替换功能,如图16-6与图16-7所示。
图16-6“Edit”菜单
图16-7“Search”菜单
通过按住Shift键并移动箭头键,可以选择特定的文本段落,进行拷贝、剪切和粘贴操作。
注意,TC环境下这些常用命令的快捷键与Windows的标准快捷键不同(TC发布时还没有Windows操作系统,它的快捷键定义没有成为Windows的标准),读者别搞错了。
16.4编译与链接
C语言的源程序都必须经过编译(生成目标文件“*.obj”)与链接(生成可执行文件“*.exe”)两个步骤才能运行。
TC环境的编译链接命令都位于“Compile”菜单,如图16-8所示。
图16-8“Compile”菜单
对于一般的程序,读者可以使用“Compile|Make”命令(快捷键为F9),编译链接一起搞定。
如果程序没有问题,TC环境会显示编译链接已成功通过对话框。
如果程序出现了错误,则会在TC环境下面的窗口中给出错误提示信息,程序员可以根据提示信息修改源文件,更正错误。
如果程序员仅仅只想编译源文件,而不想生成最终的可执行文件,可以使用“Compile|Compile”命令;而若确信目标文件已编译好,则可以使用“Compile|Link”命令将目标文件链接城最终的可执行文件。
图16-9消息窗口
在编译和链接的过程中,可能会出现一些错误,此时系统会在屏幕下方显示如图16-9所示的消息窗口,该窗口会显示编译与链接的警告与错误信息。
此时消息窗口(窗口1)会处于激活状态,用户的键盘输入都会发送到该窗口。
要想修改程序,即使得源代码窗口(窗口2)接收用户输入,应使用Alt加上窗口编号快捷键进入该窗口。
窗口编号总是显示在该窗口标题栏的右上角,例如使用Alt+2组合键进入源代码“Hello.c”的编辑窗口。
确定哪个窗口当前正出于激活状态的方法很简单。
观察窗口的边框,如果边框为双白色线,则处于激活状态;未激活窗口的边框为单蓝色线。
16.5程序的执行
在生成可执行文件后,程序员可以使用“Run|Run”命令执行程序,如图16-10所示。
图16-10“Run”菜单
在程序运行结束后系统可能会自动回到TC编辑环境,程序员看不到最终的输出结果,此时可以使用“File|DOSshell”命令回到DOS提示符下查看程序运行结果。
如果此菜单项也不起作用,则可以手工启动一个命令提示符窗口,然后变更到可执行程序的目录下,手工输入可执行文件名执行它。
注意,如果程序出现致命错误,导致系统没有响应,程序员可以使用“Run|Programreset”命令(Ctrl+F2快捷键)强制终止程序执行。
对于较大的程序,只使用一个源文件是不好的——因为代码量过大,程序维护成本太高。
此时,应该将这些文件按照其中代码的逻辑关系分成多个源文件和头文件,并通过工程项目文件的形式将它们组织在一起。
16.6工程文件管理
在TurboC环境下,组织工程项目的文件扩展名为“*.prj”。
读者可以通过TurboC编程环境的“Project(工程项目)”菜单下的“OpenProject(打开工程项目)...”菜单项创建或打开一个新工程,如图16-11所示。
图16-11TurboC编程环境下的“OpenProject”菜单项
如果要打开一个已有的新工程,通过“OpenProjectFile(打开工程项目文件)”对话框选择需要的工程项目;如果要创建一个新工程,则可以在“OpenProjectFile(打开工程项目文件)”编辑框下输入新的工程项目名称即可,如图16-12所示。
注意,图16-12中工程项目的完整路径为“A:
\C\Chap07\Eg0704\Eg0704.prj”。
图16-12TurboC编程环境下的“OpenProjectFile”对话框
一旦创建了一个新的工程项目,用户就可以通过“Project(工程项目)”菜单下的“AddItem(添加新项目)...”菜单项向工程中添加新的源文件,如图16-13与图16-14所示。
图中添加的源文件为“A:
\C\Chap07\Eg0704\Main.c”。
由图16-14可知,一旦完成了源文件的添加操作,在TurboC编程环境的“Project”窗口中就会出现对应的源文件名与其它信息。
图16-13TurboC编程环境下的“AddItem”菜单项
图16-14TurboC编程环境下向工程项目中添加源文件
注意,只能添加本工程项目必须的源文件,与本工程项目无关的源文件并不需要添加。
此外,头文件并不需要添加到工程项目列表中,虽然添加它们一般也不会导致任何问题。
如果用户屏幕没有显示“Project”窗口,从“Window”菜单选择“Project”命令即可打开它。
用户可以使用Alt键与每个窗口右上角的数字构成的组合键切换到该窗口。
只有“Project”窗口为当前激活窗口时,“Project|AddItem...”菜单项才可以使用。
在完成工程项目设定并编译链接程序之后,选择“File(文件)”菜单的“DOSshell”菜单项可以临时退出TurboC编程环境进入DOS窗口(在DOS命令行输入“exit”命令可以返回编译环境),此时就可以在DOS窗口看到类似图16-15这样的文件列表:
图16-15TurboC编程环境下向工程项目文件列表
此时就可以在DOS命令行输入链接好的可执行文件名称执行它了,本例中的可执行文件名为“Eg0704.exe”,程序员直接输入“eg0704”即可。
16.7工作目录与工作环境设置
所谓工作目录就是用户存储文件时所使用的缺省目录。
这个目录并不一定就是用户程序文件所在的目录。
如果没有正确设置工作目录,部分读者可能会发现编辑出来的源文件与编译、链接后的二进制可执行文件结果并不在一起。
对于不熟悉DOS操作系统的程序员而言,经常会找不到编译链接后的可执行程序。
此时用户可以通过选择“File|ChangeDir...”菜单项调出“ChangeDirectory”对话框改变当前目录,如图16-16所示。
图16-16“ChangeDirectory”对话框
注意,文件另存对话框与改变目录对话框都只能接受已经存在的目录。
如果在设置目录时该目录还不存在,系统会报告目录不存在错误,拒绝执行命令。
一旦完成上述设置,用户程序的源文件与编译链接文件都会自动保存到该目录下。
对于多文件的工程项目,有时候需要为整个工程项目进行额外的目录设置,例如将源文件放置在某个目录下,将编译出来的二进制中间文件、可执行文件放置另一目录下。
同时,工程项目可能还需要使用其他人提供的函数库,这些库的头文件既不在C标准库头文件目录(缺省安装时为C:
\TC\INCLUDE)下,也不在用户的当前目录下。
对于库的可链接二进制文件也同样,这些库的可链接二进制文件既不在C标准库库文件目录(缺省安装时为C:
\TC\LIB)下,也不在用户的当前目录下。
如果没有正确设置文件目录,系统不可能查找到正确的头文件和库文件。
图16-17“Directories”对话框
此时,用户可以通过“Options|Directories...”菜单项设置编程环境的各项缺省目录。
如图16-17所示,“InputDirectories”编辑框表示头文件的查找目录集合,如果需要的部分头文件不在所列的目录下,将其所在目录的绝对路径填入即可。
注意,在实际填写路径时,不能删除已存在的内容,直接添加在后面即可,每个路径项之间以分号分隔。
相应地,“LibraryDirectories”编辑框表示库的二进制可链接文件的查找目录集合。
“OutputDirectory”编辑框表示输入目录,这里只能填写一条路径,系统的输出文件(主要是“*.obj”与“*.exe”文件)都会写入该目录。
如果没有指定本路径,则系统自动使用当前工作目录保存这些文件。
“LibraryDirectories”编辑框表示源代码的保存目录。
如果未指定,系统同样使用当前工作目录保存这些文件。
16.8错误与警告
如果在编译与链接的过程中没有出现任何错误或警告,系统会显示如图16-18所示的链接窗口,上面显示了可执行文件的名称,链接的库文件名以及链接和可用内存信息。
DOS系统一般只能使用640KB的常规内存(使用特殊的机制可能访问更多的内存空间,但是这个数字仍然会远远小于现在动辄上GB的内存空间),所以还剩余529KB内存已经是很大很大的数字了。
图16-18链接信息窗口
如果编译或链接过程出现了错误,系统则会在编译或链接信息窗口显示警告和错误数目。
为说明问题,假设存在下述程序代码:
#include
constintn=2;
intmain()
{
inta[n]={1,2};
intb=2;
printf("%d;%d\n",a[0],a[1]);
printf("Hello,World!
\n");
return0;
}
在编译上述代码时,系统显示出现了两条错误消息与一条警告消息,如图16-19所示。
具体的消息内容会自动显示在消息对话框中。
图16-19编译信息窗口
在用户按任意键之后,系统自动激活消息窗口,如图16-20所示。
此时可以观察到错误与警告信息的具体内容。
图16-20警告与错误消息
错误与警告信息的显示格式固定的,首先是“Error”或“Warning”表示该消息是错误还是警告,然后是产生该错误或警告消息的文件名和所在的源代码行数,冒号之后是错误或警告消息的具体解释。
例如上述程序的第一条错误信息表示“hello.c”文件的第6行出现“需要使用常数表达式”错误;第二条错误信息表示“hello.c”文件的第6行出现“初始化值太多”错误;而警告消息则表示“hello.c”文件的第11行出现“‘b’被赋值但从未使用”警告。
用户可以使用上下箭头键在错误与警告消息间移动。
然后在消息窗口按回车键,系统自动激活对应源代码窗口,将光标定位在出现错误或警告的位置,并在源代码窗口的最后一行显示该错误或警告消息,如图16-21所示。
图16-21警告与错误消息窗口与源代码窗口的切换
特别需要注意的是,因为编译器的原因,有些错误是相关的。
对于本例,发生第一条错误的原因是不能使用常量作为数组元素个数定义数组(在C++中是允许的),只要将常量定义改为常数定义就可以更正该错误:
#definen2
此后,重新编译程序,读者就可以发现不仅第一条错误没有了,第二条错误也没有了。
还需要说明的是,每条警告都需要重视。
当程序中出现警告时,往往是表示程序编译没有问题,也能够生成最终的可执行文件,但程序极有可能隐含了未知问题。
对于本例,定义并初始化的整数b从来没有使用,所以该变量是完全没有必要的。
删除或注释掉该变量定义就会消除该条警告消息。
16.9基本调试技术
编译时出现的错误与警告总是语法上的。
只要熟悉语法规则,多编写一些程序有了经验,语法错误的修改总是比较容易的。
链接时当然也可能出现错误,链接错误一般总是致命的——不能得到正确的链接文件,但是链接错误一般是因为缺少可供链接的文件引起的,改正错误的方式比较简单,提供缺少的文件即可。
如果是因为编译器文件本身出现了问题,或者拷贝一个新的文件替换旧文件,或者重新安装系统。
也许编写程序时最郁闷的不是出现了很多错误与警告消息,而是一条错误与警告消息也没有,但是程序的最终运行结果却不正确。
此时出现的错误就不再是语法错误,而是逻辑错误。
程序逻辑错误非常难以调试。
幸运的是开发环境提供了丰富的调试工具供用户使用。
这些调试工具都位于“Run”菜单与“Debug”菜单。
16.9.1运行到光标处
选择“Run|Gotocursor”菜单项可以让程序在运行到源代码窗口处光标所在行时停止执行。
此时,用户可以查看以前的代码是否出现问题,然后使用其他调试工具或者一行一行执行代码或者一个函数一个函数的执行代码观察程序的运行是否正确。
“Run|Gotocursor”菜单项的快捷键为F4,使用快捷键会非常方便。
16.9.2调试函数体
当出现函数调用时,如果用户不知道函数内部是否出现了逻辑错误,可以调试函数体。
在进行调试时,如果程序接下来的流程将要进行函数调用,选择“Run|Traceinto”菜单项可以让程序流程进入函数体单步执行,观察函数体内代码是否正确。
在该行程序没有问题时,继续使用此菜单项执行下一行语句。
在该行数调试完毕,系统会自动回到主调函数的下一行继续调试过程。
“Run|Traceinto”菜单项的快捷键为F7。
16.9.3跳过函数体调试
有些函数一定不会出现问题,例如标准库函数和用户自己编写的但已经过考验的函数代码,此时试图调试它是没有意义的。
在此情况下,可以选择“Run|Stepover”菜单项一次就执行完一个函数,直接调试主调函数后面的那一行代码。
“Run|Stepover”菜单项的快捷键为F8。
16.9.4程序复位
一旦在调试过程中发现了错误所在,可以选择“Run|Programreset”菜单项直接终止调试过程。
“Run|StepOver”菜单项的快捷键为Ctrl+F2。
16.10高级调试技术
考虑教材例12-3的调试。
程序代码如下:
1#include
2voidSwap(int*x,int*y);
3intmain()
4{
5intm=1,n=2;
6printf("main(beforeswapped):
m=%d;n=%d\n",m,n);
7Swap(&m,&n);
8printf("main(afterswapped):
m=%d;n=%d\n",m,n);
9return0;
10}
11voidSwap(int*x,int*y)
12{
13intt;
14if(!
x||!
y)
15{
16printf("Swap:
Parameter(s)illegal.\n");
17exit
(1);
18}
19printf("Swap(beforeswapped):
*x=%d;*y=%d\n",*x,*y);
20t=x;//错误代码,正确代码应为t=*x;
21*x=*y;
22*y=t;
23printf("Swap(afterswapped):
*x=%d;*y=%d\n",*x,*y);
24}
因为输入错误,第20行少写了指针引领操作符。
如果忽略编译警告,程序能够执行,不过如图16-22所示,其结果并不正确。
图16-22错误程序的运行结果
16.10.1数据观察
使用开发环境中的观察窗口观察数据值的变化。
观察窗口作为有效的调试工具,允许用户在其中添加一些数据对象。
调试过程时,系统会在屏幕下方显示一个“Watches”窗口,直接显示这些数据对象在单步执行时的值变化。
如图16-23所示,要添加待观察的数据对象,选择“Debug|Watches|AddWatch...”菜单项,在弹出的“AddWatch”对话框中输入数据对象的名称即可。
图16-23添加待观察数据对象
重复两次,添加两个数据对象m、n,完成后系统会自动显示“Watches”窗口。
如果要停止观察某个数据对象,激活“Watches”窗口,然后选中该数据对象,直接按Delete键或选择“Debug|Watches|Deletewatch”删除它。
将光标移动到第6行(main函数中第一条printf语句),按F4运行到光标处,此时屏幕显示如图16-24所示。
可以看到,m、n的值是完全正确的。
图16-24跟踪m、n值的变化
(一)
按F8键跳过printf函数调用,然后按F7键进入Swap函数。
因为m、n并不是Swap函数中定义的变量,因而值都是无定义的。
继续按F8键执行,一直到Swap函数运行结束返回main函数,此时可以发现m、n的值发生了改变,m为2,n为-12,如图16-25所示。
这与实际结果不符,表明一定是Swap函数出现了问题。
图16-25跟踪m、n值的变化
(二)
16.10.2数据监视
监视窗口与观察窗口不同,它可以为数据对象提供更详细地监测信息。
当程序调试执行到Swap函数中时,选择“Debug|Inspect...”菜单项打开如图16-26所示的“DataInspect”窗口。
在“Inspect”编辑框中输入待监测的数据对象名称,鼠标单击“OK”按钮或选中该按钮后按回车即可。
图16-26数据监视对话框
注意,如果程序没有调试执行,则不能打开监视窗口,这一点也与观察窗口不同。
系统为每个数据对象打开一个小小的监视窗口,如图16-27所示。
监视窗口中会显示该数据对象的绝对地址,数据对象的类型及值。
图16-27监测*x、*y值的变化
继续调试执行程序,一直到程序执行第23行代码。
如图16-27所示,此时可以发现*y的值发生了变化,*y的绝对地址为8F21:
FFF2,数据类型为int,值被赋为-12(0xFFF4)。
这表明,在此之前*y,也就是main函数中的n值已经发生错误。
这个赋值错误只能是由t引起的。
16.10.3表达式求值
程序员可以在程序运行时计算查看表达式的值,并且如果该表达式的值出现了错误,可以临时在调试过程中更正该错误,将其设为其他值进行后续调试。
图16-28表达式求值
选择“Debug|Evaluate