《C程序设计》实验指导
《C程序设计》教研组
上机操作简介
一.用Turbo C 上机过程
Turbo C 是一个集程序编辑、编译、连接、调试为一体的C语言程序开发软件,具有速度快、效率高、功能强等优点,使用非常方便。C语言程序员可在Turbo C环境下进行全屏幕编辑,利用窗口功能进行编译、连接、调试、运行、环境设置等工作。
在DOS提示符下键入TC并回车;或在WINDOWS 环境下,点击“我的电脑”或“资源管理器”图标,找到TC.EXE文件,直接双击该文件,进入TC屏和含本产品版本的框,当击任一键后,版本信息即消失,全主屏仍然保持(按ALT+ENTER,转入全屏显示)。
TC主屏,由四部分组成:主菜单、编辑窗口、消息窗口和功能键提示行。
1. TC编辑器简介
编辑窗口中插入(Insert)模式下输入代码时,可用回车键来结束一行(TC编辑器不自动换行)。最大行宽为248个字符,编辑器窗口宽77列,如打过77列,窗口随着字符的键入滚动。TC屏状态行告诉光标在文件中行、列。
编辑窗口里如何操作源文件
如果在调用编辑窗口之前未装入文件,即么TC编辑器将自动命名为NONAME.C,这时编辑器具有一切特征,可以:
· 建立名为NONAME.C或别的名字的新源文件。
·装入编辑器一已存在的文件。
·从源文件列表中选择一个装入窗口进行编辑。
·保存编辑窗口中的文件。
·把编辑器里的文件写入一个新文件。
·消息窗口和编辑窗口之间进行切换。
创建和编辑源文件,但还未编译时,勿需消息窗口,所以可用F5把编辑窗口扩大到整个屏幕,再按F5还原(回到分屏模式)。
1) 创建源文件
可用下面两种方法建立文件:
·主菜单中,选File/New,再按回车键,可打开编辑窗口,文件名为NONAME.C
· 主菜单中,选File/Load,装入文件名提示框打开,键入新源文件名。(任何时候按热键F3也可达到相同目的)。
File/Load或File/Pick可装入编辑一已存在的文件。
主菜单中选File/Load后,可以:
· 键入想编辑文件的名字;例如,路径可以接受,C:\TURBOC\TESTFILE.C
·在装入文件名字提示框中打入过通匹符(用DOS中* 和?匹配符),然后按回车键。*.*显示当前目录中的所有文件和其它子目录。目录名后跟反斜杠(\)。选择目录将显示其中的文件。例如,键入C:\*.,只显示根目录中具有该扩展名的文件。
按Up/Down及Left/Right光标键把高亮长条移到所需文件的名字上,回车;即可装入选择的文件,当前的状态是编辑状态。
还有一个热键可重装入(加载)先前装入的文件,按ALT_F6(改变窗口内容,切换当前编辑器里的文件与前次加载的文件)。
2) 源文件存盘
·系统中任何时候,按F2
·主菜单中,选择File/Save
3) 写输出文件
可以把编辑器里的文件写到一个新文件,也可重写一个已存在文件。即可以写到当前(缺省)目录,也可以写到另外一个驱动器和目录里。
2. 菜单命令简介
主菜单中,选File/Write To, 然后在新名字提示窗口中,键入新文件全名;例如:C:\dir\subdir\filename.ext
主菜单中包含一些用户主要使用的条目:装入、编辑、编译、连接、调试及运行Turob C程序。这八个菜单选择包括:File、Edit、Run、Compile、Project、Options、Debug和Break/Watch。这里给出它们的详细描述。主菜单中的一些下拉菜单中的任选项是为高级编程服务的,第三章再作详述。
1) 文件菜单
文件下拉菜单提供了装入已存在文件;建立编辑器;然后,可将其存入任何一个目录任何一个文件名。另外,通过文件菜单中可以改变目录;暂时退到命令解释程序,或者说退出Turbo C。
Load (加载)
装入一个文件,可用类似DOS的匹配符(如*.C)来进行列表选择,也可装入某一个文件,只要给出其文件名即可。
注:若驱动器或路径给错了,屏幕上将出现一错误框。确认框是在未存一个修改过的文件前又加载另一文件的情况下出现的。不论哪种情况,只有敲了所需键之后热键才起作用。
Pick(选择)
最近装入进编辑窗口的8个文件列成一个表,让用户选择其一,选择后又装入编辑器,光标置在上次修改过的地方。若选了“—Load file—”条目,屏幕上将出现Load File相应热键是ALT_X.
2) 编辑命令
编辑命令调用内部编辑器。编辑器中按F10可返回主菜单(或用ALT加所需主菜单命令的首字母),这时仍然保持在屏幕上,主菜单中按ESC或E,即可回到编辑器(按ALT_E也可,且任何时候都起作用)。
编辑命令简要说明
下面是最常用的编辑命令的一个提要:
· Up/Down、Left/Right和Pgup/PgDn键翻滚正文。
· CTRL_Y 删除一行。
· CTRL_T 删除一个单词。
· CTRL_KB设置(开始)
· CTRL_KK设置(结尾)置块标块。
· CTRL_KV块移动。
· CTRL_KC块拷贝。
· CTRL_KY块删除。
3) Run运行
Run/Run运行程序可用Options/Argument传递参数。若自上次编译后源代码有变动,则启用“make”来重编译、连接程序。(“make”是集成开发环境里的一程序开发工具。)
若不想调试程序,编译连接时Debug/Source Debugging开关应置为None或Standalone。否则,产生的可执行代码中将包含调试信息,在下面几个方面对程序的执行效果有所影响:
若上次编译后未修改过源代码:
* 若设有断点则Run/Run使程序运行到下一断点。否则运行到底。
若上次编译后修改过源代码:
* 若已通过Run/Step Over(F8) 或Run/Trace Into (F7)单步执行程序,Run/Run将在屏幕上询问是否要重make程序。
* 按Y,将重新编译连接程序,再从头开始运行。
* 按N,则运行至下一断点。或运行到底(若无断点)。
若不是在单步执行,则在重新编译连接程序之后,从头开始运行。
调试命令及热键
热 键
菜单命令
说 明
F4
Run/To to Cursor
运行程序到光标所在行。将初始化一调试节。
CTRL_F2
Run/Program Reset
结束当前调试节,释放分配的内存,关闭所有文件。仅在调节有效。
F7
Run/Trace Into
运行当前函数中的下一条语句。若遇到更低一级的函数调用,而该函数编译时O/C/C/OB Debug Information开关为On,则跟踪进函数内部。将初始化一调试节。
F8
Run/Step Over
运行当前函数中的下一条语句。不跟踪宗函数。将初始化一调试节。
CTRL_F9
Run/Run
运行程序,有或没有调试器,必要时将编译、连接源文件,如经编译了,而连接时
Debug/Source Debugging和O/C/OBJ Debug Information又置为On,则程序运行至断点或运行完。
F5
放大缩小活动窗口
ALT_F5
显示转入用户屏,击任意键返回集成环境屏
F6
循环激活编辑、监视和消息窗口
ALT_F6
若编辑窗口是活动的,则转到上次装入编辑器的文件,若下面的那个窗口是活动的,则进行监视窗口与消息窗口间的切换
CTRL_F9
Run/Run
运行程序,有或没有调试器,必要时将编译、连接源文件,如经编译了,而连接时
Debug/Source Debugging和O/C/OBJDebug Information 又置为On,则程序运行至断点或运行完。
Project/Remove
Messages 删除消息窗口中的内容
4) 编译菜单
可用编译菜单里的条目来将源文件编译成OBJ文件(Compile to OBJ);生成.EXE文件(Link EXE File);重建(Build All);设置Prinmary C File;运行或显示上次编译的信息(Get Info)。
Compile to OBJ编译生成目标码
此命令将一.C源文件编译成.OBJ文件,同时显示生成的文件的名字;例如C:EXAMPLE.OBJ。.OBJ文件名由以下两种方法依序产生:
· 源.C文件名;或者,
· 如没说明时,上次装入编辑窗口的文件名。
Turbo C编译时,弹出一窗口,显示编译结果。编译/组装(make)完之后,击任一键去掉编译窗口。若发现错,则转到消息窗口的第一条错误上(高亮度标志)。
此命令热键为ALT_F9。
Make EXE File生成执行文件
此命令调用Project_Make来生成一.EXE文件,显示生成的.EXE文件名,例如:
C:EXAMPLE.EXE
5) 消息窗口
编译和调试源程序时都需要通过消息窗口(Message Window)来察看诊断消息。TC唯一的错误跟踪机制把所有编译文件的警告和错误都更在消息窗口若悬河了,同时在编辑窗口中指出错误在源文件中的相应位置(依Option/Envionment菜单中的Message Tracking命令设置而定)。
二.上机实验总的目的和要求
学习程序设计,上机实验总的目的:
加深对讲授内容的理解,尤其是一些语法规定,光靠课堂讲授,很难记住,通过多次上机,就能自然地、熟练地掌握。
熟悉所用的计算机系统的操作方法,也就是了解和熟悉C语言程序开发的环境。
学会上机调试程序,要善于发现程序中的错误,并能很快地排除这些错误,使程序能正确运行。计算机技术是实践性很强的技术,要求从事这一领域的人不仅能了解和熟悉有关理论和方法,还要自已动手实现。对程序设计者来说,要求会编程序并上机调试通过。因此调试程序本身是程序设计课程的一个重要的内容和基本要求,应充分重视。在实验时千万不要在程序通过后就认为万事大吉、完成任务,而应当在已通过的程序基础上作一些改动,再进行编译、连接和运行,注意观察和分析所出现的情况,这样的学习才会有真正的收获,才是灵活主动地学习而不是呆板被动地学习。
上机实验一般应包括以下几个步骤:
准备好上机所需的程序。手编程序应书写整齐,并经人工检查无误后才能上机,以提高上机效率。以程序中自已有疑问的地方,应作出记号,以便在上机时给予注意。
上机输入和调试自已所编的程序。上机过程中出现的问题,除了系统题以外,一般应自已独立处理,不要轻易问教师。尤其对“出错信息”,应善于自已分析判断。这是学习调试程序的良好机会。
使用键盘时,最好采用正确的指法击键,为今后提高输入速度打下基础。
上机结束后,应对运行情况作出分析,总结本次调试程序所取得的经验,并由指导老师登记成绩,此成绩将作为总评成绩的一部分。
下面给出八个实验内容,供学生上机用。
实 验 一
一.目的要求
了解所用的计算机系统的基本操作方法,学会独立使用该系统。
熟悉并掌握在该系统上如何编辑、编辑、连接和运行一个C程序。
通过运行简单的C程序,初步了解C源程序的特点。
掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。
学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用。
二.实验内容
学习从开机开始的操作,包括如何建立子目录、使用操作命令列目录、删除文件、复制文件等。
调试编辑程序。
输入程序,以test1.c为文件名保存,并进行编译和运行。
main( )
{
printf(“This is a book..”);
printf(“This is a pen.”);
}
应了解所用的系统是用什么命令进行编译和连接运行的。编译和连接后所得到的目标程序的后缀是什么形式的?若将两个语句分行输出,应怎样修改程序?
输入并运行程序:
main()
{ char c1,c2;
c1=97; c2=98;
printf(“%c %c\n”,c1,c2);
printf(“%c%c\n”,c1-32,c2-32);
printf(%c,%d,c1,c2);
}
在此基础上:
加一个printf语句,并运行之。
printf(“%d,%d”,c1,c2);
再将第三行改为:
int c1,c2;
再使之运行。
再将第四行改为:
c1=300; c2=400;
再使之运行,分析其运行结果。
输入并运行程序:
main( )
{
int i,j,m,n;
i=8; j=10;
m=++i; n=++j;
printf(“%d,%d,%d,%d,%d,%d”,i,j,++i,++j,m,n);
}
分别作以下改运并运行:
将第5行改为:
m=i++; n=++j;
程序改为
main( )
{ int i,j;
i=8; j=10;
printf(“%d,%d”,i++,j++);
}
将2)程序第4行,改为:
printf (“%d,%d”,++i,++j);
4)自已作任意修改。
实验评分____________ 指导老师签名______________
实 验 二
一.目的与要求
消化教科书上第5、6章的内容,并将之灵活地运用到实际问题中去。
掌握C语言逻辑量的表示方法(以0代表“假”,1代表“真”)
学会正确地使用关系表达式和逻辑表达式
掌握各种形式的条件语句(注意( )和{ }的使用)
掌握switch语句
二.实验内容
编制程序,解决以下问题,然后上机调试运行程序
要求对任意一组x,y的确定值,均能输出相关的信息。
2. 每吨货物每公里运费p与运输距离s有关。路途愈远,每吨公里运价愈低。公式如下:
若所付的总运费超过5000元时,再给予九五折优待。从键盘输入货物吨数、运输公里数,用开关语句(switch)计算运费。
实验评分____________ 指导老师签名______________
实 验 三
一.目的与要求:
循环是构造C语言程序的一种十分重要的控制结构,稍微复杂一点的程序就可能必须包含循环结构,所以,必须通过听课、复习及上机熟练地掌握第七章的有关内容。
熟练地掌握while、do-while及for语句实现循环的方法,了解它们各自的长处,及相互转换的方法。
掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等算法)。
二.实验内容
1.编程并上机调试运行以下程序
已知: F(N)=F(N—1)—2F(N—2)+F(N—3)
F(0)=F(1)=F(2)=1
求 (1) F(50)
(2) F(0)+……+F(50)
2.编程求100以内的勾股数组
说明:我国古代称直角三角形的两条直角边为勾和股,斜边为弦。早在“周髀算经”的第一篇内就谈到“勾广三,股修四,弦隅五”。在公元263年,我国数学家刘徽写的“九章算术”中有:
的记载,凡是满足x2+y2=z2的正整数数组(x,y,z)就叫做一个勾股数组。
如:(3,4,5)、(5,12,13)、(7,24,25)、(8,15,17)均为合法的勾股数组。
实验评分____________ 指导老师签名______________
实 验 四
一.目的与要求:
掌握编译预处的文件包含(#include)命令,了解#include使用的环境、格式(两种)与作用
掌握函数的有关知识,学会灵活地使用函数
掌握函数的定义方法
掌握函数形参与实参的对应关系及“值传递”方法
掌握函数的嵌套调用和递归调用方法
掌握全局变量和局部变量、静态存储变量和动态存储变量的概念与存储方法。
二.实验内容:
编程解决下列问题,并上机调试运行
1.用牛顿迭代法求方程ax3+bx2+cx+d=0的根,系数a,b,c,d在主函数中输入,求x在1附近的一个实根。求出实根后,在主函数中输出。
说明:牛顿迭代法的公式为
2.编程求任意两个整数a,b的最大公约数和最小公倍数。用一个函数求最大公约数,另一函数求最小公倍数。
(1)用全局变量方法:将两个整数的最大公约数、最小公倍数都设为全局变量。
(2)不用全局变量,两个整数在主函数中输入,并传送给一个函数,求出最大公约数后返回主函数,然后再与两个整数一起作为实参传给另一个函数,以求出最小公倍数。返回到主函数输出最大公约数和最小公倍数。
3. 下面的C程序实现以下函数的计算,请将其中的错误更正。
# include “math.h”
# include “stadio.h”
main ( )
{ float x,y,z,sum;
scanf (“%d%d%d”, x,y,z)
sun = f(x,y,z)+f(y,z,x)+f(z,x,y);
printf(“sum=%f”, sun);
}
floatf(a,b,c)
{ value= sin (a)sin(b) * sin (c) };
return (value);
}
实验评分____________ 指导老师签名______________
实 验 五
一.目的与要求
掌握一维数组和二维数组的定义、赋值和输入输出的方法。
掌握字符数组和字符串函数的使用。
掌握与数组有关的算法(例如排序)。
二.实验内容
用选择法对10个字母排序,10个字母用scanf函数输入。
输入下列程序,并编译、连接并运行。
main()
{
int i,j,k,score;
int scores [10] [5];
for (i=0; i<10; i++)
{ j=0;
while (j<5)
{ printf(“Please enter score #%d: ” j);
scanf(“%d”,score);
if (score<0)
break;
scores[i][++j]=score;
}
scores[i][0]=j;
}
}
3.上述程序统计十个学生四门课程成绩(第一列为从1开始的顺序号),当输入成绩为负数时,退出该运行程序。现要求当输入负数时,只不计入该学生成绩,并不退出运行,试将上述程序改写,实现此功能。
实验评分____________ 指导老师签名______________
实验六 指 针
目的要求
掌握指针的概念、指针变量的定义和使用方法。
学会使用数组的指针和指向数组的指针变量。
学会使用字符串的指针和指向字符串的指针变量。
学会使用指向函数的指针变量。
了解指向指针的指针的概念及其使用方法。
实验内容
编写一个strcmp函数实现两个字符串的比较:
strcmp(s1,s2)
如果s1=s2,则函数返回值为0;如果s1(s2,返回它们两者之间第一个不同字符的ASCII码差值(如“BOY”与“BAD”,第二个字母不同,“O”与“A”之差为79(65=14);如果s1>s2,则输出正值;如果s1<s2,则输出负值。
两个字符串s1、s2在main函数中输入,strcmp函数的返回值也在main函数中输出。
请编写程序并上机调试运行。
2. 下列程序求a数组中所有素数之和,函数isprime用来判断自变量是否为素数。请将程序补充完整并上机调试运行。
#include"stdio.h"
main()
{int i,a[10],*p=a,sum=0;
printf("Enter 10 num:\n");
for (i=0;i<10;i++) scanf("%d",&a[i]);
for (i=0;i<10;i++)
if (isprime(*(p+ ))==1)
{printf("%d ",*(a+i));
;
}
printf("\nThe sum=%d\n",sum);
}
isprime(x)
int x;
{int i;
for (i=2;i<=x/2;i++) if (x%i==0) return 0;
;
}
实验评分____________ 指导老师签名______________
实验七 结构体与共用体
一.目的要求
掌握结构体类型变量的定义和使用方法。
掌握结构体类型数组的概念和使用方法。
掌握共用体的概念与使用方法。
二.实验内容
有5个学生,每个学生的数据包括学号、姓名、三门课程的成绩,从键盘输入输出5个学生的数据,要求打印出三门课程的总平均成绩,以及最高分学生的数据(包括学号、姓名、三门课程的成绩、平均分数)。
请编写程序并上机调试运行。
2.下面程序运行后的正确结果是7,2,5 。但程序中有概念上的错误和键入错误,请改正程序中的错误并上机调试运行。
struct ks
{int a;
int *b;
};
main()
{struct ks s[4],*p;
int n=1,i;
for (i=0;i<4;i++)
{s[i].a=n;
s[i].b=&s[i].a;
n=n+2;
}
p=&s[0];
printf("%d,%d,%d\n",s[3]->a,++(*p->b),*s[2]->b);
}
实验评分____________ 指导老师签名______________
实 验 八
一.目的与要求
掌握文件以及缓冲文件系统、文件指针的概念。
学会使用文件的打开与关闭、文件的读写等操作函数。
学会用缓冲文件系统对文件进行简单的操作。
二.实验内容
下述程序用于统计文件中的字符个数,请补充程序。
# include <stdio.h>
main ( )
{FILE * FP;
long num=0;
if ((fp=fopen (“TEST”, “rt”))=NULL)
{print f (“Can’t open file.”);
return;}
while ( (1) ) num ++;
(2) ;
print f (“num=%1d”, num);}
2. 假设文件A.DAT和B.DAT中的字符都按降序排列,下述程序将这两个文件合并成一个降序排列的文件C.DAT,请将程序补充完整。
# include <stdio.h>
main ( )
{FILE *f1, *f2, *out;
int flag 1=1, flag2=1;
char a, b, c;
f1=fopen (“A. DAT”, “r”);
f2=fopen (“B.DAT”, “r”);
out=fopen (“C.DAT”, “w”);
if ( !f1 || !f2 || !out)
{print f(“can’t open file.”);
return;
}
do
{ if (! feo f(f1) && (1) )
{ a = fgetc (f1);
if ( (2) )
break;
}
if (! feof (f2) && flag 2)
{ b=fget (f2);
if ( (2) )
break;
}
if (a>b)
{ c=a; flag1=1; flag2=0;
}
else
{ c=b; flag1=0; flag2=1;
}
f putc ( (3) )
}
while (1);
fclose (f1);
fclose (f2);
fclose (out);
}
3. 有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门功课成绩),计算出平均成绩,将原始数据和计算出的平均成绩存放在磁盘文件“stud”中。
实验评分____________ 指导老师签名______________
常见编译错误信息
Turbo C编译程序查出的源序错误分为三类:致命错误、一般错误和警告。
致命错误出现很少,它通常是内部编译出错。在发生致命错误时,编译立即停止,必须采取一些适当的措施并重新编译。
一般错误指程序的语法错误、磁盘或内存存取错误或命令行错误等。编译程序将完成现阶段的编译,然后停止。编译程序在每个阶段(预处理、语法分析、优化、代码生成)尽可能多地发现源程序中的错误。
警告并不阻止编译进行。它指出一些值得怀疑的情况,而这些情况本身又可以合理地成为源程序的一部分。如果在源文件中使用了与机器有关的结构,编译也将产生警告信息。
编译程序首先输出这三类错误信息;然后输出源程序文件名和发现出错的行号,最后输出信息的内容。
下面按字母顺序分别列出这三类错误信息。对每一条信息,提供可能产生的原因和纠正方法。
请注意错误信息处有关行号的一个细节:编译程序只产生被检测到的信息。因为C并不限定在正文的某行放一语句,这样,真正产生错误的行可能在编译指出的前一行或几行。在下面的信息列表中,我们指出了这种可能。
致命错误
1. Bad call of in-line function内部函数非法调用
在使用一个宏定义的,内部函数时,没能正确调用。一个内部函数以两个划线(____)开始和结束。
2. Irreducible expression tree不可约表达式树
这种错误指的是文件行中的表达式使得代码生成无法为它产生代码。这种表达式必须避免使用。如果编译时总遇到这种情况,应该通知Borland公司。
3. Register alloction failure存储器分配失效
这种错误指的是源文件行中的表达式太复杂,代码生成程序无法为它生成代码。此时应简化这种繁杂的表达式或干脆避免使用它。如果编译时总遇到这种错误,应通知Borland公司。
一般错误
1. #operator not followed by macto argument name
# 运算符后没跟宏变元名。在宏定义中,#用于标识一宏变元名串,“#”后必须跟一宏变元名。
2. ‘xxxxxxxx’ not an a rgument
‘xxxxxxxx’不是函数参数。在源程序是将该标识符定义为一个函数参数,但此标识符没有函数表中出现。
3. Ambiguous symbol ‘xxxxxxxx’
二义性符号‘xxxxxxxx’。两个或多个结构的某一域名相同,但具有的偏移、类型不同。在变量或表达式中引用该域而未带结构名时,将产生二义性,此时需修改某个域名或在引用时加上结构名。
4. Argument # missing name
参数#名丢失。参数名已脱离用于定义函数的函数原型。如果函数或原型定义必须包含所有的参数名。
5. Argument list syntax error
参数表出列语错误。函数调用的参数间必须以逗号隔开,并以一右括号结束。若源文件中含有一个其后不是逗号也不是右括号的参数,则出错。
6. Array bounds missing
数组的界线符‘1’丢失。在源文件中定义了一个数组,但此数组没有以一右方括号结束。
7. Array size too large
数组长度太大。定义的长度太大,可用内存不够。
8. Assembler statement too long
汇编语句太长。内部汇编语句最长不能超过480字节。
9. Bad configuration file
配置文件不正确。TURBOC.CFG配置文件中包含不是合适命令行选择项的非注解文字。配置文件命令选择必须以一短横线(—)开始。
10. Bad file name format in include directive
包含指令中文件名格式不正确。包含文件名必须引用(“filename.h”)或尖括号(<filename.h>)括起来,否则将产生本类错误。如果使用了宏,则产生的扩展文本也不正确(因为无引号)。
11. Bad ifdef directive syntax
ifdef指令语法错误。#ifdef必须以单个标识符(只此一个)作为该指令的体。
12. Bad ifndef directive syntax
ifndef指令语法错误。#ifndef必须以单个标识符(只此一个)作为该指令的体。
13. Bad undef directive syntax
undef指令语法错误。#undef指令必须以单个标识符(只此一个)作为该指令的体。
14. Bad file size syntax
位字段长语法错误。一个位字段长必须是1~16位的常量表达式。
15. Call of non-function
调用未定义函数。正被调用的函数无定义,通常是由于不正确的函数声明或函数名拼错造成的。
16. Cannot modify a const object
不能修改一个常量对象。对定义为常量的对象进行不含法操作(如常量赋值)引起本错误。
17. Case outside of switch
Case出现在switch外。编译程序发现Case语句外面,通常是由于括号不匹配造成的。
18. Case statement missing
Case语句漏掉。Case语句必须包含一以冒号终结的常量表达式。可能的原因是丢了冒号或在冒号前多了别的符号。
19. Cast syntax error
Cast语法错误。Cast中包含了一些不正确的符号。
20. Character constant too long
字符常量太长。字符常量只能是一个或两个字符长。
21. Compound statement missing
复合语句漏掉。编译程序扫描到源文件末时,未发现结束大括号,通常是由于大括号不匹配造成的。
22. Conflicting type modifiers
类型修饰符冲突。对同一指针,只能指定一种变址修饰符(如near 或 far);而对于同一函数,也只能给出一种语言修饰符(如cdecl、pascal或interrupt)。
23. Constant expression required
要求常量表达式。数组的大小必须是常量,本错误通常是由于#define常量的拼写出错而引起的。
24. Could not fnd file‘xxxxxxx.xxxx’
找不到‘xxxxxxxx.xxx’文件。编译程序找不到命令行上给出的文件。
25. Declaration missing
说明漏掉‘;’。在源文件中包含了一个struct或union域声明,但后面漏掉了分号(;)。
26. Declaration needs type or storage class
说明必须给出类型或存储类。说明必须饮食一个类型或一个存储类,以下说明是不正确的:i,j;
27. Declaration syntax error
声明出现语法错误。在源文件中,某个声明丢失了某些符号或有多余的符号。
28. Default outside of switch
Default在switch外出现。编译程序发现default语句出现在switch语句之外,通常是由于括号不匹配造成的。
29. Define directive needs an identifer
Define指令必须有一个标识符。#Define后面的第一个非空格符必须是一标识符,若编译程序发现一些其它字符,则出现本错误。
30. Division by Zero
除数为零。源文件的常量表达式中,出现除数为零的情况。
31. Do statement must have while
Do语句中必须有while。源文件中包含一无while关键字的do语句时,出现本错误。
32. Do—while statement missing(
Do—while语句中漏掉了(。在do语句中,编译程序发现while关键字后无左括号。
33. Do—while statement missing )
Do—while语句中漏掉了)。在do语句中,编译程序发现条件表达式后无右括号。
34. Do—while statement missing ;
Do—while语句中漏掉了分号。在do语句中的条件表达式中,编译程序发现右括号后面无分号。
35. Duplicate Case
Case的情况不唯一。Switch语句的每个case必须有一个唯一的常量表达式值。
36.Enum syntax error
Enum语法出现错误。Enum说明的标识符表的格式不对。
37. Enumeration constant syntax error
枚举常量语法错误。赋给enum类型变量的表达式值不为常量。
38. Error Directive: xxxx
Error指令:xxxx。源文件处理#error指令时,显示该指令指出的信息。
39. Error writing output file
写输出文件出现错误。通常是由于磁盘空间满造成的,尽量删掉一些不必要的文件。
40. Expression syntax
表达式语法错误。当编译程序分析一表达式并发现一些严重错误时,出现本错误,通常是由于两个连续操作符、括号不匹配或缺少括号、前一语句漏掉了分号等引起的。
41. Extra parameter in call
调用时出现多余参数。调用函数时,其实际参数个数多于函数定义中的参数个数。
42. Extra parameter in call to xxxxxxxx
调用xxxxxxxx函数时出现了多余的参数。其中该函数由原型定义。
43. File name too long
文件名太长。# include指令给出的文件名太长,编译程序无法处理。DOS下的文件名不能超过64个字符。
44. For statenent missing (
For语句漏掉"("。编译程序发现在for关键字后缺少左括号。
45. For statemen missing )
For语句缺少")"。在for语句中,编译程序发现在控制表达式后缺少右括号。
46. For statement missing ;
For语句缺少";"。在for 语句中,编译程序发现在某个表达式后缺少分号。
47. Function call missing )
函数调用缺少")"。函数调用的参数表有几种语法错误,如左括号漏掉或括号不匹配。
48. Function definition out of place
函数定义位置错误。函数定义不可出现在另一函数内。函数内的任何说明,只要以类似于带有一个参数表的函数开始,就被认为是一个函数定义。
49. Function doesn’t take a variable number of argument
函数不接受可变的参数个数。源文件中的某个函数内使用了va-start宏,此函数不能接受可变数量的参数。
50. Goto statement missing label
Goto语句缺少标号。在goto关键字后面必须有一个标识符。
51. If staement missing (
If语句缺少"("。在if语句中,编译程序发现if关键字后面缺少左括号。
52. If statement missing )
If语句缺少")"。在if语句中,编译程序发现测试表达式后缺少右括号。
53. Illegal character '('(ox XX)
非法字符'('(oxXX)。编译程序发现输入文件中有一些非法字符。以十六进制方式打印该字符。
54. Illegal initialization
非法初始化必须是常量表达式后一个全局变量extern或static的地址加减一常量。
55. Illegal octal digit
非法八进制数。编译程序发现在一个八进制常数中包含了非八进制数字(8或9)。
56. Illegal pointer subtraction
非法指针相减。这是由于试图以一个非指针变量减去一个指针变量而造成的。
57. Illegal structure operation
非法结构操作。结构只能使用(.)、取地址(&)和赋值(=)操作符,或作为函数的参数传递。当编译程序发现结构使用了其它操作符时,出现本错误。
58. Illegal use of floating point
浮点运算非法。浮点运算操作数不允许出现在移位、按位置逻辑操作、条件(?:)、间接(*)以及其它一些操作符中。编译程序发现上述操作符中使用了浮点操作数时,出现本错误。
59. Illegal use of pointer
指针使用非法。指针只能在加、减、赋值、比较、间接(*)或箭头(→)操作中使用。如用其它操作符,则出现本错误。
60. Improper use of a typedef symbol
typedef符号使用不当。源文件中使用了一个符号,符号变量应在一个表达式中出现。检查一下此符号的说明和可能的拼写错误。
61. In-line assembly not allowed
内部汇编语句不允许。源文件中含有直接插入的汇编语句,若在集成环境下进行编译,则出现本错误。必须使用TCC命令行编译此源文件。
62. Incompatible storage class
不相容的存储类。源文件的一个函数定义中使用了extern关键字,而只有static(或根本没有存储类型)是允许的。
63. Incompatible type conversion
不相容的类型转换。源文件中试图把一种类型转换成另一种类型。但这两种类型是不相容的。如函数与非函数间转换、一种结构或数组与一种标准类型转换、浮点数和指针间转换等。
64. Incorrect command line argument:xxxxxxxx
不正确的命令行参数:xxxxxxxx。编译程序认为此命令行参数是非法的。
65. Incorrect configuration file argument: xxxxxxxx
不正确的配置文件参数:xxxxxxxx(-),编译程序认为此配置文件是非法的。检查一下前面的短横线(-)
66. Incorrect number format
不正确的数据格式。编译程序发现在十六进制数中出现十进制小数点。
67. Incoorect use of default
default不正确使用。编译程序发现default关键字后缺少分号。
68. Initializer syntax error
初始化语法错误。初始化过程缺少或多了操作符,括号不匹配或其它一些不正常情况。
69. Invalid indrection
无效的间接运算。间接运算操作符(*)要求非空指针作为操作分量。
70. Invatid macro argument seperator
无效的宏参数分隔符。在宏定义中,参数必须用逗号相隔。编译程序发现在参数名后面有其它非法字符,出现本错误。
71. Invalid pointer addition
无效的指针相加。源程序中试图把两个指针相加。
72. Invalid use of array
箭头使用错。在箭头(→)操作符后必须跟一标识符。
73. Invalid use of dot
点使用错。在点(.)操作符后必须跟一标识符。
74. Lvalue required
赋值请求。赋值操作符的左边必须是一个地址表达式,包括数值变量、指针变量、结构引用域、间接指针和数组分量。
75. Macro argument syntax error
宏参数语法错误。宏定义中的参数必须是一个标识符。编译程序发现所需的参数不是标识符的字符,则出现本错误。
76. Macro expansion too long
宏扩展太长。一个宏扩展不能多于4096个字符。当宏递归扩展自身时,常出现本错误。宏不能对自身进行扩展。
77. May compile only one file when an output file name is given
给出一个输出文件名时,可能只编译一个文件。在命令行编译中使用-o选择,只允许一个输出文件名。此时,只编译第一个文件,其它文件被忽略。
78. Mismatch number of parameters in definition
定义中参数个数不匹配。定义中的参数和函数原型中提供的信息不匹配。
79. Miaplaced break
break位置错误。编译程序发现break语句在switch语句或循环结构外。
80. Misplaced continue
Continue位置错。编译程序发现continue语句在循环结构外。
81. Misplaced decimal point
十进制小数点位置错。编译程序发现浮点常数的指数部分有一个十进制小数点。
82. Misplaced else
else位置错。编译程序发现else语句缺少与之相匹配的if语句。本错误的产生,除了由于else多余外,还有可能是由于有多余的分号、漏写了大括号或前面的if语句出现语法错误而引起。
83. Misplaced elif directive
elif指令位置错。编译程序没有发现与#elif指令相匹配的#if、#ifdef或#ifndef指令。
84. Misplaced else directive
else指令位置错。编译程序没有发现与#else指令相匹配的#if、#ifdef或#ifdef指令。
85. Misplaced endif directive
endif指令位置错。编译程序没有发现与#endif指令相匹配的#if、#indef或#ifndef指令。
86. Must be addressable
必须是可编址的。取址操作符(&)作用于一个不可编址的对象,如寄存器变量。
87. Must take address of memory location
必须是内存一地址。源文件中对不可编址表达式用了地址操作符(&),如对寄存器变量。
88. No file name ending
无文件名终止符。在#include语句中,文件名缺少正确的闭引号(")或尖括号(>)。
89. No file names given
未给出文件名。Turbo命令行编译(TCC)中没有任何文件。编译必须有一文件。
90. Non-portable pointer assignment
对不可移植的指针赋值。源程序中将一个指针给一个非指针,或相反。但作为特例,允许把常量零值赋给一个指针。结果比较恰当,可以强行抑制本错误信息。
91. Non-portable pointer comparison
不可移植的指针比较。源程序中将一个指针和一个非指针(常量零除外)进行比较。如果比较恰当,应强行抑制本错误信息。
92. Non-portable return type conversion
不可移植的返回类型转换。在返回语句中的表达式类型与函数说明中的类型不同。但如果函数的返回表达式是一指针,则可以进行转换。此时,返回指针的函数可能送回一个常量零,而零被转换成一个适当的指针值。
93. Not an allowed type
不允许的类型。在源文件中说了几种禁止的类型,如函数返回一个函数或数组。
94. Out of memory
内存不够。所有工作内存用完,应把文件放到一台有较大内存的机器去执行或简化源程序。
95. Pointer required on left side of
操作符左边须是一指针
96. Redeclaration of 'xxxxxxxx'
'xxxxxxxx'重定义。此标识符已经定义过。
97. Size of structure or array not known
结构或数组大小不定。有些表达式(如sizeof或存储说明)中出现一个未定义的结构或一个空长度数组。如果结构长度不需要,在定义之前就可引用;如果数组不申请存储空间或者初始化时给定了长度,那么就可定义为空长。
98. Statement missing;
语句缺少";"。编译程序发现一表达式语句后面没有分号。
99. Structure or union syntax error
结构或联合语法错误。编译程序发现在struct或union关键这后面没有标识符或花括号。
100. Structure size too large
结构太大。源文件中说明了一个结构,它所需的内存区域太大以致存储空间不够。
101. Subscripting missing ]
下标缺少'] '。编译程序发现一个下标表达式缺少闭方括号。可能是由于漏掉或多写操作符或括号不匹配引起的。
102. Switch statement missing (
switch语句缺少'('。在switch语句中,关键字switch后面缺少左括号。
103. Switch statement missing )
switch语句缺少')'。在switch语句中,测试表达式后面缺少右括号。
104. Too few parameters in call
函数调用参数太少。对带有原型的函数调用(通过一个函数指针)参数太少。原型要求给出所有参数。
105. Too few parameter in call to 'xxxxxxxx'
调用'xxxxxxxx'时参数太少。调用指定的函数(该函数用一原型声明)时,给出的参数太少。
106. Too many cases
Case太多。Swith语句最多只能有257个Cases.
107. Too many decimal points
十进制小数点太多。编译程序发现一个浮点常量中带有不止一个的十进制小数点。
108. Too many exponents
阶码太多。编译程序发现一个浮点常量中有不止一个的阶码。
109. Too many exponents
阶码太多。编译程序发现初始化比声明所允许的要多。
110. Too many initializers
初始化太多。编译程序发现初始化比声明所允许的要多。
111. Too many storage classes in declaration
声明中存储类太多。一个声明只允许有一种存储类。
112. Too many types in decleration
声明中类型太多。一个声明只允许有一种下列基本类型:
Char、int、float、double、struct、union、enum或typedef名。
113. Too much auto memory in function
函数中自动存储太多。当前函数声明的自动存储超过了可用的存储器空间。
114. too much code define in file
文件定义的代码太多。当前文件中函数的总长超过了64k字节可以移去不必要的代码或把源文件分开来写。
115. Too much global data define in file
文件中定义的全局数据太多。全局数据声明的总数超过了64k字节。检查一下一些数组的定义是否太长。如果所有的说明都是必要的,考虑重新组织程序。
116. Two consecutive dots
两个连续点。因为省略号包含三个点(…),而十进制小数点和选择操作符使用一个点(.),所以在C程序中出现两个连续点是不允许的。
117. Type missmatch in parameter #
参数“#”类型不匹配。通过一个指针访问已由原型声明的参数时,给定参数#N(从左到右N逐个加1)不能转换为已声明的参数类型。
118. Type missmatch in parameter # in call to 'XXXXXXXX'
调用'XXXXXXX'时参数#类型不匹配。源文件中通过一个原型声明了指定的函数,而给定的参数(从左到右N逐个加1)不能转换为已说明的参数类型。
119. type mismatch in parameter 'XXXXXXX'
参数'XXXXXXX'类型不匹配。源文件中通过一个原型声明了可由函数指针调用的函数,而所指定的参数不能转换为已说明的参数类型。
120. Type mismatch in parameter 'XXXXXXX' in call to 'YYYYYYYY'.
调用'YYYYYYYY'时参数'XXXXXXX'类型不匹配。源文件中通过一个原型声明了指定的参数不能转换为另一个已说明的参数类型。
121. Type mismatch in redclaration of 'XXX'
重定义类型不匹配。原文件中把一个已经声明的变量重新声明为另一种类型。如果一个函数被调用,而后又被说明成非整型也会产生本错误。在这种情况下,必须在第一次调用函数前,给函数加上extern声明。
122. Unable to creat output file 'XXXXXXX.XXX'
不能创建输出文件'XXXXXXX.XXXX'。当工作软盘已满或有写保护时产生本错误。如果软盘已满,删除一些不必要的文字后重新编译;如果软盘有写保护,把源文件移到一个可写的软盘上并重新编译。
123. Unable to create turboc. Ink
不能创建turboc. Ink。编译程序不能创建临时文件TURBOC.$LN,因为它不能存取磁盘或者磁盘已满。
124. Unable to execute command 'xxxxxxxx'
不能执行'xxxxxxxx'命令。找不到TLINK或MASM,或者磁盘出错。
125. Unable to open include file 'xxxxxxxx.xxx'
不能打开包含文件'xxxxxxxx.xxx'。编译程序找不到该包含文件。可能是由于一个#include文件包含它本身而引起的,也可能是根目录下的CONFIG.SYS中没有设置能同时打开的文件个数(试加一句files=20)。
126. Unable to open inputfile 'xxxxxxx.xxx'
不能打开输入文件'xxxxxxxx.xxx'。当编译程序找不到源文件时出现本错误。检查文件名是否拼错或检查对应的软盘或目录中是否有此文件。
127. Undefined label 'xxxxxxxx'
标号'xxxxxxxx'未定义。函数中goto语句后的标号没有定义。
128. Undefined structure 'xxxxxxxx'
结构'xxxxxxxx'未定义。源文件中使用了未经说明的某个结构。可能是由于结构名拼写错或缺少结构说明而引起。
129. Undefined symbol 'xxxxxxxx'
符号'xxxxxxxx'未定义。标识符无定义,可能是由于说明或引用处有拼写错误,也可能是由于标识符说明错误引起。
130. Unexpected end of file in comment started on line #
源文件在某个注释中意外结束。通常是由于注释结束标志(*/)漏掉引起。
131. Unexpected end of file in conditional stated on line #
源文件在#行开始的条件语句中意外结束,在编译程序遇到#endif前源程序结束,通常是由于#endif漏掉或拼写错误引起的。
132. Unknown preprocessor directire 'xxx'
不认识的预处理指令:'xxx'。编译程序在某行的开始遇到‘#’字符,但其后的指令名不是下列之一:
define、undef、line、if、ifdef、ifndef、include、else或endif。
133. Unterminated character constant
未终结的字符常量。编译程序发现一个不匹配的省略符。
134. Unterminated string
未终结的串。编译程序发现一个不匹配的引号。
135. Unterminated string or character constant
未终结的串或字符常量。编译程序发现串或字符常量开始后没有终结。
136. User break
用户中断。在集成环境里进行编译或连接时用户按了Ctrl-Break键。
137. While statement missing (
While语句漏掉'('。在while语句中,关键字while后缺少左括号。
138. While statement missing )
while语句漏掉'('。在while语句中,关键字while后缺少右括号。
139. Wrong number of arguments in of 'xxxxxxxx'
调用'xxxxxxxx'时参数个数错误。源文件中调用某个宏时,参数个数不对。
警告
1. 'xxxxxxxx' declared but never used
说明了'xxxxxxxx'但未使用。在源文件中说明了此变量,但没有使用。当编译程序遇到复合语句或函数的结束处括号时,发出本警告。
2. 'xxxxxxxx'is assigned a value which is never used
'xxxxxxxx'被赋以一个不使用的值。此变量出现在一个赋值语句里,但直到函数结束都未使用过。当编译程序遇到结束的闭花括号时发出本警告。
3. 'xxxxxxxx'not part of structure
'xxxxxxxx'不是结构的一部分。出现在点(.)或箭头(→)左边的域名不是结构的一部分,或者点的左边不是结构,箭头的左边不指向结构。
4. 'Ambiguous operators need parentheses'
二义性操作符需要括号。当两个位移、关系或按位操作符在一起使用而不加括号时,发出本警告;当一加法或减法操作符不加括号与一位移操作符出现在一起时,也发出本警告。程序员总是混淆这些操作符的优先,因为它们的优先级不太直观。
5. Both return and return of a value used
既用返回又用返回值。编译程序发现一个与前面的return语句不一致的return语句,发出本警告。当某函数只在一些return语句中返回值时一般会产生错误。
6. Call to function with prototype
调用无原型函数。如果“原型请求”警告可用,且又调用了一无原型的函数,就发出本警告。
7. Call to function 'xxx' with prototype
调用无原型的'xxxx'函数。如果“原型请求”警告可用,且又调用了一个原先没有原型的函数'xxxx',就发出本警告。
8. Code has no effect
代码无效。当编译程序遇到一个含无效操作符的语句时,发出本警告。如语句:a+b;对每一变量都不起使用,无需操作,且可能引出一个错误。
9. Constant is long
常量是long类型。当编译程序遇到一个十进制常量大于32767,或一个八进制常量大于65535而其后没有字母“1”或“L”时,把此常量当作long类型处理。
10. Constant out of range in comparision
比较时常量超出了范围。在源文件中有一个比较,其中一个常量子表达式超出了另一个子表达式类型所允许的范围。如一个无符号量跟-1比较就没有意义。为得到一大于32767(十进制)的无符号常量,可以在常量前加上unsigned(如(unsigned) 65535)或在常量后加上字母‘u’或‘U’(如65535u)。
11. Conversion may lose significant digits
转换可能丢失高位数字。在赋值操作或其它情况下,源程序要把long或unsigned long类型转变成int或unsigned int类型。在有些机器上,因为int型和long型变量具有相同长度,这种转换可能改变程序的输出特性。
无论本警告何时发生,编译程序仍将产生代码来做比较。如果代码比较后总是给出同样结果,比如一个字符表达式与4000比较,则代码总要进行测试。这还表示一个无符号表达式可以与-1作比较,因为8087机器上,一个无符号表达式与-1有相同的位模式。
12. Function should eturn a value
函数应该返回一个值。源文件中说明的当前函数的返回类型既非int型也非void型,但编译程序未发现返回值。返回int型的函数可以不说明,因为在老版本的C语言中,没有void类型来指出函数不返回值。
13. Mixing pointers to signed and usigned char
混淆signed和unsigned字符指针。没有通过显式的强制类型转换,就把一个字符指针转变为无符号指针,或相反。
14. No declaration for function 'xxxxxxxx'
函数'xxxxxxxx'没有说明。当“说明请求”警告可用,而又调用了一个没有预先说明的函数时,发出本警告。函数说明可以是传统的,也可以是现代(原型)的风格。
15. Non-portable pointer assignment
不可能移植指针赋值。源文件中把一个指针赋给另一非指针,或相反。作为特例,可以把常量零赋给一指针。如果合适,可以强行抑制本警告。
16. Non-portable pointer comparision
不可移植指针比较。源文件中把一个指针和另一非指针(非常量零)作比较。如果合适,可以强行抑制本警告。
17. Non-portable return type conversion
不可移植返回类型转换。Reutrn语句中的表达式类型和函数说明的类型不一致。作为特例,如果函数或返回表达式是一个指针,这是可以的,在此情况下返回指针的函数可能返回一个常量零,被转变成一个合适的指针值。
18. Paramrter 'xxxxxxxx'is never used
参数'xxxxxxxx'没有使用。函数说明中的某参数在函数体里从未使用,这可以但不一定是一个错误,通常是由于参数名拼写错误而引起。如果在函数体内,该标识符被重新定义为一个自动(局部)变量,也将发生本警告。此参数被标识为一个自动变量但未使用。
19. Possible use of 'xxxxxxxx' before definition
在定义'xxxxxxxx'之前可能已使用。源文件的某一表达式中使用了未经赋值的变量,编译程序对源文件进行简单扫描以确定此条件。如果该变量出现的物理位置对它赋值之前,就会产生本警告,当然程序的实际流程可能在使用前已赋值。
20. Possible incorrect assignment
可能的不正确赋值。当编译程序遇到赋值操作符作为条件表达式(如if、while或do-while语句的一部分)的主操作符时,发生本警告,通常是由于把赋值号当作等号使用了。如果希望禁止此警告,可把赋值语句用括号括起,并且把它与零作显式比较,如:
if (a=b) … 应写为: if ((a=b)!=0)…
21. Redefinition of 'xxxxxxxx' is not identical
'xxxxxxxx'重定义不相同。源文件中对命名宏重定义时,使用的正文内容与第一次定义时不同,新内容将代替旧内容。
22. Restarting compiler using assembly
用汇编重新启动编译。编译程序遇到一个未使用命令行选择项-B或#pragma inline语句的asm。通过使用汇编重新启动编译。
23. Structure passed by value
结构按值传送。如果“结构按值传送”警告可用,则在结构作为参数按值传送时产生本警告。通常是在编制程序时,把结构作为参数传递,而又漏掉了地址操作符(&)。因为结构可以按值传送,因此这种遗漏是可接受的。本警告只起一个提示作用。
24. Suplerfluous & with function or array
在函数或数组中有多余的'&'号。取址操作符(&)对一个数组或函数名是不必要的,应该去掉。
25. Suspicious pointer conversion
值得怀疑的指针转换。编译程序遇到一些指针转换,这些转换引起指针指向不同的类型,如果合适,应强行抑制本警告。
26. Undefined structure 'xxxxxxxx'
结构'xxxxxxxx'未定义。在源文件中使用了该结构,但未定义。可能是由于结构名拼写错误或忘记定义而引起的。
27. Unknown assembler instruction
不认识的汇编指令。编译程序发现在插入的汇编语句中有一个不允许的操作码。检查此操作的拼写,并查看一下操作码表看该指令能否被接受。
28. Unreachable code
不可达代码。Break、continue、goto或retuen语句后没有跟标号或循环函数的结束符。编译程序使用一个常量测试条件来检查while、do和for循环,并试图知道循环没有失败。
29. Void function may not return a value
Void函数不可以返回值,源文件中的当前函数说明为void,但编译程序发现一个带值的返回语句,该返回语句的值将被忽略。
30. Sero length structure
结构长度为零。在源文件中定义了一个总长度为零的结构,对此结构的任何使用都是错误的。