




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第16章 简明Turbo C 3.0上机帮助手册Turbo C 3.0(TC)是一个集编辑、编译、链接、调试与一体的集成开发环境,它不仅能够开发标准C程序,也能够开发C+程序。不过由于TC发布时间太早,仅支持文本用户界面,因而只能在DOS窗口执行。同时,它支持的C+功能有限。16.1 Turbo C 3.0上机环境简介要运行TC环境,在Windows操作系统下进入可执行文件“TC.EXE”所在的目录,双击执行它,Windows操作系统就会自动启动一个“命令提示符”窗口运行TC集成开发环境,如图161所示。图161 Turbo C 3.0集成开发环境整个TC环境有11个菜单,按顺序分别为: File Edit Search Run Compile Debug Project Options Window Help这些菜单的中文含义分别为:“系统”、“文件”、“编辑”、“查找”、“运行”、“编译”、“调试”、“工程项目”、“选项”、“窗口”与“帮助”。更古老的TC版本(例如Turbo C 2.0)的菜单和相应的菜单项与此可能有差别,不过主要的命令都是有的。除了最左边的“系统”菜单,其他每个菜单项的第一个字母都是红色大写字符,这表示用户可以使用Alt与该字符构成的组合键进入该菜单,例如对于“File”菜单,用户可以使用Alt+F组合键打开该菜单。TC界面使用了扩展ASCII字符集,其中绘制边框的字符与Windows的Unicode字符有冲突,窗口边框可能显示的是乱码,好在并不影响程序的正常使用。运行TC更好的方式是单独使用一台只有DOS操作系统的微机这显然并不现实,所以读者可以使用诸如VMware Workstation之类的虚拟机软件虚拟一个DOS操作系统出来,然后在虚拟机上安装Turbo C开发环境。16.2 文件的创建和保存在进入TC开发环境后,程序员就可以使用“File(文件)”菜单中的“New”菜单项(一般简记为“File | New命令”或“File | New菜单项”)创建一个新的C程序文件,如图162所示。图162 使用“File | New”命令缺省情况下,新创建的文件名为“noname00.cpp”这样的文件,具体保存位置为当前目录,例如图163种创建的新文件名为“noname00.cpp”,保存目录为“A:CChap07Eg0704”(驱动器盘符被省略了)。此时程序员就可以在新开的编辑窗口输入C程序源代码了。图163 创建新文件当用户编辑好源文件之后,应该为其起个有意义的名字保存起来。此时可以通过“File | Save”命令打开“Save File As”对话框(第一次保存文件时,使用“File | Save”命令等价于使用“File | Save As”命令),如图164所示。图164 保存文件程序员可以在图164中的“Save File As”编辑框中输入要保存文件的文件名(可以包含完整或相对路径),在“Files”列表框中选择文件的保存路径,然后单击“OK”按钮保存。注意,在图164显示的对话框底部蓝色区域为待保存文件的当前完整路径信息。另外,因为Turbo C开发环境还可以编译C+ 程序,所以文件的缺省扩展名为“*.cpp”,在保存文件时,一定要使用“*.c”扩展名,这将保证编译器会按照C语言而不是C+ 格式编译程序。C+ 虽然支持C,但是部分功能并不完全相同,例如const定义的常量不是在C中作为数组元素个数参与数组定义,但在C+ 中则是允许的。如果要将文件保存到其他磁盘,则应在“Save File As”编辑框输入该驱动器的盘符和冒号,然后键入回车键,“Files”列表框就会自动显示新驱动器下的目录列表。如果用户的环境没有鼠标支持,则可以使用Tab键在对话框中切换输入焦点。或者,使用Alt键加黄色字符直接将输入焦点转移到对应控件处。例如,如果用户想更改文件名,可以使用Alt + S组合键将输入焦点移动到“Save File As”编辑框,若想更改路径,则可以使用Alt + F更改目录。在设置完毕后,使用回车键或Alt + K组合键接受输入,使用ESC键取消操作。一旦用户保存了文件一次,下次保存文件时就可以直接使用“File | Save”命令保存对文件的改动了。为方便用户的操作,TC环境为很多常用命令定义了快捷键,例如“File | Save”命令对应的快捷键为F2,“File | Open.”命令对应的快捷键为F3,程序员可以在任意窗口使用快捷键执行菜单命令。此后,一旦用户退出TC再次进入,可以使用“File | Open.”命令打开过去编辑的文件。如图165所示,“Open a File”对话框的样子和“Save File As”对话框类似,使用方法也差不多。图165 打开文件注意,在保存和打开文件时,如果使用“*.c”为文件扩展名后缀,程序员需要在文件名编辑框中手工改变扩展名,才能在文件列表框中显示对应类型文件。注意,C语言本身是区分大小写的语言,但是DOS操作系统确是不区分大小写的操作系统。因而文件名的大小写对于程序其实没有任何关系。在包含头文件时也同样,例如包含头文件“STDIO.H”时使用#include 与#include 没有什么两样。不过为了移植性的考虑,不建议大家使用大写字母。C标准库的缺省文件名都是小写字母的,而部分操作系统确实区分文件名的大小写。16.3 源文件的编辑对新建立的文件或已存在的文件都可以进行编辑操作。TC环境提供了强大的文件编辑与查找替换功能,如图166与图167所示。图166 “Edit”菜单图167 “Search”菜单通过按住Shift键并移动箭头键,可以选择特定的文本段落,进行拷贝、剪切和粘贴操作。注意,TC环境下这些常用命令的快捷键与Windows的标准快捷键不同(TC发布时还没有Windows操作系统,它的快捷键定义没有成为Windows的标准),读者别搞错了。16.4 编译与链接C语言的源程序都必须经过编译(生成目标文件“*.obj”)与链接(生成可执行文件“*.exe”)两个步骤才能运行。TC环境的编译链接命令都位于“Compile”菜单,如图168所示。图168 “Compile”菜单对于一般的程序,读者可以使用“Compile | Make”命令(快捷键为F9),编译链接一起搞定。如果程序没有问题,TC环境会显示编译链接已成功通过对话框。如果程序出现了错误,则会在TC环境下面的窗口中给出错误提示信息,程序员可以根据提示信息修改源文件,更正错误。如果程序员仅仅只想编译源文件,而不想生成最终的可执行文件,可以使用“Compile | Compile”命令;而若确信目标文件已编译好,则可以使用“Compile | Link”命令将目标文件链接城最终的可执行文件。图169 消息窗口在编译和链接的过程中,可能会出现一些错误,此时系统会在屏幕下方显示如图169所示的消息窗口,该窗口会显示编译与链接的警告与错误信息。此时消息窗口(窗口1)会处于激活状态,用户的键盘输入都会发送到该窗口。要想修改程序,即使得源代码窗口(窗口2)接收用户输入,应使用Alt加上窗口编号快捷键进入该窗口。窗口编号总是显示在该窗口标题栏的右上角,例如使用Alt2组合键进入源代码“Hello.c”的编辑窗口。确定哪个窗口当前正出于激活状态的方法很简单。观察窗口的边框,如果边框为双白色线,则处于激活状态;未激活窗口的边框为单蓝色线。16.5 程序的执行在生成可执行文件后,程序员可以使用“Run | Run”命令执行程序,如图1610所示。图1610 “Run”菜单在程序运行结束后系统可能会自动回到TC编辑环境,程序员看不到最终的输出结果,此时可以使用“File | DOS shell”命令回到DOS提示符下查看程序运行结果。如果此菜单项也不起作用,则可以手工启动一个命令提示符窗口,然后变更到可执行程序的目录下,手工输入可执行文件名执行它。注意,如果程序出现致命错误,导致系统没有响应,程序员可以使用“Run | Program reset”命令(Ctrl + F2快捷键)强制终止程序执行。对于较大的程序,只使用一个源文件是不好的因为代码量过大,程序维护成本太高。此时,应该将这些文件按照其中代码的逻辑关系分成多个源文件和头文件,并通过工程项目文件的形式将它们组织在一起。16.6 工程文件管理在Turbo C环境下,组织工程项目的文件扩展名为“*.prj”。读者可以通过Turbo C编程环境的“Project(工程项目)”菜单下的“Open Project(打开工程项目).”菜单项创建或打开一个新工程,如图1611所示。图1611 Turbo C编程环境下的“Open Project”菜单项如果要打开一个已有的新工程,通过“Open Project File(打开工程项目文件)”对话框选择需要的工程项目;如果要创建一个新工程,则可以在“Open Project File(打开工程项目文件)”编辑框下输入新的工程项目名称即可,如图1612所示。注意,图1612中工程项目的完整路径为“A:CChap07Eg0704Eg0704.prj”。图1612 Turbo C编程环境下的“Open Project File”对话框一旦创建了一个新的工程项目,用户就可以通过“Project(工程项目)”菜单下的“Add Item(添加新项目).”菜单项向工程中添加新的源文件,如图1613与图1614所示。图中添加的源文件为“A:CChap07Eg0704Main.c”。由图1614可知,一旦完成了源文件的添加操作,在Turbo C编程环境的“Project”窗口中就会出现对应的源文件名与其它信息。图1613 Turbo C编程环境下的“Add Item”菜单项图1614 Turbo C编程环境下向工程项目中添加源文件注意,只能添加本工程项目必须的源文件,与本工程项目无关的源文件并不需要添加。此外,头文件并不需要添加到工程项目列表中,虽然添加它们一般也不会导致任何问题。如果用户屏幕没有显示“Project”窗口,从“Window”菜单选择“Project”命令即可打开它。用户可以使用Alt键与每个窗口右上角的数字构成的组合键切换到该窗口。只有“Project”窗口为当前激活窗口时,“Project | Add Item.”菜单项才可以使用。在完成工程项目设定并编译链接程序之后,选择“File(文件)”菜单的“DOS shell”菜单项可以临时退出Turbo C编程环境进入DOS窗口(在DOS命令行输入“exit”命令可以返回编译环境),此时就可以在DOS窗口看到类似图1615这样的文件列表:图1615 Turbo C编程环境下向工程项目文件列表此时就可以在DOS命令行输入链接好的可执行文件名称执行它了,本例中的可执行文件名为“Eg0704.exe”,程序员直接输入“eg0704”即可。16.7 工作目录与工作环境设置所谓工作目录就是用户存储文件时所使用的缺省目录。这个目录并不一定就是用户程序文件所在的目录。如果没有正确设置工作目录,部分读者可能会发现编辑出来的源文件与编译、链接后的二进制可执行文件结果并不在一起。对于不熟悉DOS操作系统的程序员而言,经常会找不到编译链接后的可执行程序。此时用户可以通过选择“File | Change Dir.”菜单项调出“Change Directory”对话框改变当前目录,如图1616所示。图1616 “Change Directory”对话框注意,文件另存对话框与改变目录对话框都只能接受已经存在的目录。如果在设置目录时该目录还不存在,系统会报告目录不存在错误,拒绝执行命令。一旦完成上述设置,用户程序的源文件与编译链接文件都会自动保存到该目录下。对于多文件的工程项目,有时候需要为整个工程项目进行额外的目录设置,例如将源文件放置在某个目录下,将编译出来的二进制中间文件、可执行文件放置另一目录下。同时,工程项目可能还需要使用其他人提供的函数库,这些库的头文件既不在C标准库头文件目录(缺省安装时为C:TCINCLUDE)下,也不在用户的当前目录下。对于库的可链接二进制文件也同样,这些库的可链接二进制文件既不在C标准库库文件目录(缺省安装时为C:TCLIB)下,也不在用户的当前目录下。如果没有正确设置文件目录,系统不可能查找到正确的头文件和库文件。图1617 “Directories”对话框此时,用户可以通过“Options | Directories.”菜单项设置编程环境的各项缺省目录。如图1617所示,“Input Directories”编辑框表示头文件的查找目录集合,如果需要的部分头文件不在所列的目录下,将其所在目录的绝对路径填入即可。注意,在实际填写路径时,不能删除已存在的内容,直接添加在后面即可,每个路径项之间以分号分隔。相应地,“Library Directories”编辑框表示库的二进制可链接文件的查找目录集合。“Output Directory”编辑框表示输入目录,这里只能填写一条路径,系统的输出文件(主要是“*.obj”与“*.exe”文件)都会写入该目录。如果没有指定本路径,则系统自动使用当前工作目录保存这些文件。“Library Directories”编辑框表示源代码的保存目录。如果未指定,系统同样使用当前工作目录保存这些文件。16.8 错误与警告如果在编译与链接的过程中没有出现任何错误或警告,系统会显示如图1618所示的链接窗口,上面显示了可执行文件的名称,链接的库文件名以及链接和可用内存信息。DOS系统一般只能使用640KB的常规内存(使用特殊的机制可能访问更多的内存空间,但是这个数字仍然会远远小于现在动辄上GB的内存空间),所以还剩余529KB内存已经是很大很大的数字了。图1618 链接信息窗口如果编译或链接过程出现了错误,系统则会在编译或链接信息窗口显示警告和错误数目。为说明问题,假设存在下述程序代码:#include const int n = 2;int main() int an = 1, 2; int b = 2; printf(%d; %dn, a0, a1); printf(Hello, World!n); return 0;在编译上述代码时,系统显示出现了两条错误消息与一条警告消息,如图1619所示。具体的消息内容会自动显示在消息对话框中。图1619 编译信息窗口在用户按任意键之后,系统自动激活消息窗口,如图1620所示。此时可以观察到错误与警告信息的具体内容。图1620 警告与错误消息错误与警告信息的显示格式固定的,首先是“Error”或“Warning”表示该消息是错误还是警告,然后是产生该错误或警告消息的文件名和所在的源代码行数,冒号之后是错误或警告消息的具体解释。例如上述程序的第一条错误信息表示“hello.c”文件的第6行出现“需要使用常数表达式”错误;第二条错误信息表示“hello.c”文件的第6行出现“初始化值太多”错误;而警告消息则表示“hello.c”文件的第11行出现“b被赋值但从未使用”警告。用户可以使用上下箭头键在错误与警告消息间移动。然后在消息窗口按回车键,系统自动激活对应源代码窗口,将光标定位在出现错误或警告的位置,并在源代码窗口的最后一行显示该错误或警告消息,如图1621所示。图1621 警告与错误消息窗口与源代码窗口的切换特别需要注意的是,因为编译器的原因,有些错误是相关的。对于本例,发生第一条错误的原因是不能使用常量作为数组元素个数定义数组(在C+ 中是允许的),只要将常量定义改为常数定义就可以更正该错误:#define n 2此后,重新编译程序,读者就可以发现不仅第一条错误没有了,第二条错误也没有了。还需要说明的是,每条警告都需要重视。当程序中出现警告时,往往是表示程序编译没有问题,也能够生成最终的可执行文件,但程序极有可能隐含了未知问题。对于本例,定义并初始化的整数b从来没有使用,所以该变量是完全没有必要的。删除或注释掉该变量定义就会消除该条警告消息。16.9 基本调试技术编译时出现的错误与警告总是语法上的。只要熟悉语法规则,多编写一些程序有了经验,语法错误的修改总是比较容易的。链接时当然也可能出现错误,链接错误一般总是致命的不能得到正确的链接文件,但是链接错误一般是因为缺少可供链接的文件引起的,改正错误的方式比较简单,提供缺少的文件即可。如果是因为编译器文件本身出现了问题,或者拷贝一个新的文件替换旧文件,或者重新安装系统。也许编写程序时最郁闷的不是出现了很多错误与警告消息,而是一条错误与警告消息也没有,但是程序的最终运行结果却不正确。此时出现的错误就不再是语法错误,而是逻辑错误。程序逻辑错误非常难以调试。幸运的是开发环境提供了丰富的调试工具供用户使用。这些调试工具都位于“Run”菜单与“Debug”菜单。16.9.1 运行到光标处选择“Run | Go to cursor”菜单项可以让程序在运行到源代码窗口处光标所在行时停止执行。此时,用户可以查看以前的代码是否出现问题,然后使用其他调试工具或者一行一行执行代码或者一个函数一个函数的执行代码观察程序的运行是否正确。“Run | Go to cursor”菜单项的快捷键为F4,使用快捷键会非常方便。16.9.2 调试函数体当出现函数调用时,如果用户不知道函数内部是否出现了逻辑错误,可以调试函数体。在进行调试时,如果程序接下来的流程将要进行函数调用,选择“Run | Trace into”菜单项可以让程序流程进入函数体单步执行,观察函数体内代码是否正确。在该行程序没有问题时,继续使用此菜单项执行下一行语句。在该行数调试完毕,系统会自动回到主调函数的下一行继续调试过程。“Run | Trace into”菜单项的快捷键为F7。16.9.3 跳过函数体调试有些函数一定不会出现问题,例如标准库函数和用户自己编写的但已经过考验的函数代码,此时试图调试它是没有意义的。在此情况下,可以选择“Run | Step over”菜单项一次就执行完一个函数,直接调试主调函数后面的那一行代码。“Run | Step over”菜单项的快捷键为F8。16.9.4 程序复位一旦在调试过程中发现了错误所在,可以选择“Run | Program reset”菜单项直接终止调试过程。“Run | Step Over”菜单项的快捷键为Ctrl + F2。16.10 高级调试技术考虑教材例123的调试。程序代码如下:1#include 2void Swap(int * x, int * y);3int main()45 int m = 1, n = 2;6 printf(main (before swapped): m = %d; n = %dn, m, n);7 Swap(&m, &n);8 printf(main (after swapped): m = %d; n = %dn, m, n);9 return 0;1011void Swap(int * x, int * y)1213 int t;14 if(!x | !y)15 16 printf(Swap: Parameter(s) illegal.n);17 exit(1);18 19 printf(Swap (before swapped): *x = %d; *y = %dn, *x, *y);20 t = x; / 错误代码,正确代码应为t = *x;21 *x = *y;22 *y = t;23 printf(Swap (after swapped): *x = %d; *y = %dn, *x, *y);24因为输入错误,第20行少写了指针引领操作符。如果忽略编译警告,程序能够执行,不过如图1622所示,其结果并不正确。图1622 错误程序的运行结果16.10.1 数据观察使用开发环境中的观察窗口观察数据值的变化。观察窗口作为有效的调试工具,允许用户在其中添加一些数据对象。调试过程时,系统会在屏幕下方显示一个“Watches”窗口,直接显示这些数据对象在单步执行时的值变化。如图1623所示,要添加待观察的数据对象,选择“Debug | Watches | Add Watch.”菜单项,在弹出的“Add Watch”对话框中输入数据对象的名称即可。图1623 添加待观察数据对象重复两次,添加两个数据对象m、n,完成后系统会自动显示“Watches”窗口。如果要停止观察某个数据对象,激活“Watches”窗口,然后选中该数据对象,直接按Delete键或选择“Debug | Watches | Delete watch”删除它。将光标移动到第6行(main函数中第一条printf语句),按F4运行到光标处,此时屏幕显示如图1624所示。可以看到,m、n的值是完全正确的。图1624 跟踪m、n值的变化(一)按F8键跳过printf函数调用,然后按F7键进入Swap函数。因为m、n并不是Swap函数中定义的变量,因而值都是无定义的。继续按F8键执行,一直到Swap函数运行结束返回main函数,此时可以发现m、n的值发生了改变,m为2,n为12,如图1625所示。这与实际结果不符,表明一定是Swap函数出现了问题。图1625 跟踪m、n值的变化(二)16.10.2 数据监视监视窗口与观察窗口不同,它可以为数据对象提供更详细地监测信息。当程序调试执行到Swap函数中时,选择“Debug | Inspect.”菜单项打开如图1626所示的“Data Inspect”窗口。在“Inspect”编辑框中输入待监测的数据对象名称,鼠标单击“OK”按钮或选中该按钮后按回车即可。图1626 数据监视对话框注意,如果程序没有调试执行,则不能打开监视窗口,这一点也与观察窗口不同。系统为每个数据对象打开一个小小的监视窗口,如图1627所示。监视窗口中会显示该数据对象的绝对地址,数据对象的类型及值。图1627 监测 *x、*y值的变化继续调试执行程序,一直到程序执行第23行代码。如图1627所示,此时可以发现 *y的值发生了变化,*y的绝对地址为8F21:FFF2,数据类型为int,值被赋为12(0xFFF4)。这表明,在此之前 *y,也就是main函数中的n值已经发生错误。这个赋值错误只能是由t引起的。16.10.3 表达式求值程序员可以在程序运行时计算查看表达式的值,并且如果该表达式的值出现了错误,可以临时在调试过程中更正该错误,将其设为其他值进行后续调试。图1628 表达式求值选择“Debug | Evaluate/Modify.”菜单项打开如图1628所示的“Evaluate and Modify”窗口。在“Expression”编辑框中输入“*y”,然后选中“Evaluate”按钮后按回车,“Result”编辑框中就会显示其结果“12”。既然这个值是错误的,我们可以将其改为正确值1继续调试,看看后面的代码是否出现了问题。选中“New Value”编辑框,在其中输入“1”,然后选中“Modify”按钮按回车键,如图1629所示。新值立即就会写入 *y所在的存储区,监视窗口与求值窗口都会将新值显示出来。图1629 更正表达式值继续调试过程,此时可以发现程序所有输出都正确了,这从另一方面验证了错误出现变量t上。按CtrlF2终止调试过程,再添加三个观察数据对象t、x、y,将光标放到第20行,按F4执行到此行,如图1630所示。图1630 观察t值(一)可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采石场环保治理与经营权转让合同
- 国家电网电气安全工作知识相关试题测试卷
- 深圳小考试题及答案
- 道路交通安全自动预警与干预系统
- 2025-2031年中国钛合金棒丝材行业市场全景调研及发展趋向研判报告
- 涤纶针刺毡项目经济效益评估
- AI大模型智慧养老监护平台建设方案
- 支教访谈题目大全及答案
- 政治价值追求题目及答案
- 2025至2030年中国车速反馈仪行业投资前景及策略咨询报告
- 《中华人民共和国学前教育法》专题培训
- 国开(四川)2024年秋《社会学概论》形考任务1-2答案终结性考核答案
- SAP S4HANA 用户操作手册-FICO-006-财务月结
- 电商平台供应链管理技术分析
- 燃油燃烧器常见故障现象的原因分析及排除方法
- 北京汇文中学初一新生分班(摸底)语文考试模拟试卷(10套试卷带答案解析)
- DL∕T 901-2017 火力发电厂烟囱(烟道)防腐蚀材料
- GB/T 4074.1-2024绕组线试验方法第1部分:一般规定
- MOOC 集成电路设计基础-华中科技大学 中国大学慕课答案
- 数学分析教学课件
- 地震反演原理课件
评论
0/150
提交评论