:
char_traits>'doesnotdefinethisoperatororaconversiontoatypeacceptabletothepredefinedoperator
对于流操作的方向搞错是一个普遍错误,问题本来并不复杂,可能是由于没有认真看书的原因。
6. 定义的变量类型与使用不对应,如声明为float,但实际给与了一个double的值,例:
floatpi=3.412345245656245;
调试器错误信息:
warningC4305:
'initializing':
truncationfrom'constdouble'to'float'
7.变量在赋值之前就使用,例:
inta,b,c;c=a+b;cin>>a>>b;
调试器错误信息:
warningC4700:
localvariable'a'usedwithouthavingbeeninitialized
出现这种错误主要是对面向过程的程序执行没有理解。
8. 在一个工程中包含多于一个的main函数
errorC2556:
'int__cdeclmain(void)':
overloadedfunctiondiffersonlybyreturntypefrom'void__cdeclmain(void)'
E:
\temp\alskdf\ldid.cpp(4):
seedeclarationof'main'
E:
\temp\alskdf\ldid.cpp(15):
errorC2371:
'main':
redefinition;differentbasictypes
在上机课中始终有同学犯这种错误,原因可能是从来没有上过机。
9. 在函数定义的()后面使用分号
例:
voidchang();
{
…
}
调试器错误信息:
errorC2447:
missingfunctionheader(old-styleformallist?
)
10. 函数声明/定义/调用参数个数不匹配.
例:
voidchang(inta,intb,floatc)
{
…
}
voidmain()
{
…
chang(3,4);
}
调试器错误信息:
errorC2660:
'chang':
functiondoesnottake2parameters
最常见的20种VC++编译错误信息
1、 atalerrorC1010:
unexpectedendoffilewhilelookingforprecompiledheaderdirective。
寻找预编译头文件路径时遇到了不该遇到的文件尾。
(一般是没有#include"stdafx.h")
2、fatalerrorC1083:
Cannotopenincludefile:
'R…….h':
Nosuchfileordirectory
不能打开包含文件“R…….h”:
没有这样的文件或目录。
3、errorC2011:
'C……':
'class'typeredefinition
类“C……”重定义。
4、errorC2018:
unknowncharacter'0xa3'
不认识的字符'0xa3'。
(一般是汉字或中文标点符号)
5、errorC2057:
expectedconstantexpression
希望是常量表达式。
(一般出现在switch语句的case分支中)
6、errorC2065:
'IDD_MYDIALOG':
undeclaredidentifier
“IDD_MYDIALOG”:
未声明过的标识符。
7、errorC2082:
redefinitionofformalparameter'bReset'
函数参数“bReset”在函数体中重定义。
8、errorC2143:
syntaxerror:
missing':
'before'{'
句法错误:
“{”前缺少“;”。
9、errorC2146:
syntaxerror:
missing';'beforeidentifier'dc'
句法错误:
在“dc”前丢了“;”。
10、errorC2196:
casevalue'69'alreadyused
值69已经用过。
(一般出现在switch语句的case分支中)
11、errorC2509:
'OnTimer':
memberfunctionnotdeclaredin'CHelloView'
成员函数“OnTimer”没有在“CHelloView”中声明。
12、errorC2511:
'reset':
overloadedmemberfunction'void(int)'notfoundin'B'
重载的函数“voidreset(int)”在类“B”中找不到。
13、errorC2555:
'B:
:
f1':
overridingvirtualfunctiondiffersfrom'A:
:
f1'onlybyreturntypeorcallingconvention
类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。
14、errorC2660:
'SetTimer':
functiondoesnottake2parameters
“SetTimer”函数不传递2个参数。
15、warningC4035:
'f……':
noreturnvalue
“f……”的return语句没有返回值。
16、warningC4553:
'==':
operatorhasnoeffect;didyouintend'='?
没有效果的运算符“==”;是否改为“=”?
17、warningC4700:
localvariable'bReset'usedwithouthavingbeeninitialized
局部变量“bReset”没有初始化就使用。
18、errorC4716:
'CMyApp:
:
InitInstance':
mustreturnavalue
“CMyApp:
:
InitInstance”函数必须返回一个值。
19、LINK:
fatalerrorLNK1168:
cannotopenDebug/P1.exeforwriting
连接错误:
不能打开P1.exe文件,以改写内容。
(一般是P1.Exe还在运行,未关闭)
20、errorLNK2001:
unresolvedexternalsymbol"public:
virtual__thiscallC……:
:
~C……(void)"
连接时发现没有实现的外部符号(变量、函数等)。
VC++6.0使用步骤如下
新建工程—添加文件—编译—链接---运行
1.创建工程、文件并输入源程序代码
(1)新建Win32ConsoleApplication工程
选择file->new
选择Projects->Win32ConsoleApplication标签
ps:
在location位置可选择工程的创建位置。
选择Anemptyproject 然后选择finish
弹出如图,单击OK即可
ps:
点击左边的工程信息右下角的“FileView”选项;
可以看到你新建的工程,再双击你新建的工程名可以查看
工程的信息。
其中,SourceFiles为包含所有工程的源文件,
HeaderFiles为包含所有工程的头文件。
(2)在工程中新建C源程序文件并输入源程序代码
添加源码到add工程
ps:
建立源文件,选择“C++Source”,简单的程序都是建立这种文件
的(在单文件工程中使用),从而产生.cpp文件。
如果要建立头文件的话,选择
“C/C++HeaderFile”(在多文件工程中使用),可产生.h文件。
然后添加文
件名称。
了解:
文件扩张名是.h的文件代表的是头文件,一般是书写一些函数原型,
以及一些在整个程序中常用到的结构体,频繁使用的函数说
明,定义等等;
文件扩张名为.cpp的文件代表的是源文件,也是最常用到的
文件,每建立一个工程都要至少一个源文件(至少要有一个
函数入口——主函数main()),包含了核心代码。
此时,相关工程和文件已经创建完成,可以进行输入源码并编译链接运行。
(3)输入源程序代码
源程序代码如下:
2.编译、链接及运行
运行结果如下所示:
ps:
虽然有快速的直接敲源码,然后编译时再保存,但是编写程序最好按照工程流程操作。
如果是您有代码如:
cpp文件,或.h文件,想添加都VC6.0
里来测试的话,可以这样做:
(1)按上面步骤建立一个简单的工程
(2)在源文件选项“SourceFiles”,右键单击中的“添加目录到
工程”,添加你要打开的扩展名为.cpp的源文件。
在头文件
选项“HeaderFiles”,右键单击中的“添加目录到工程”,
添加你要打开的扩展名为.h的头文件。
添加完你所有的头
文件和源文件之后,检查一下是否添加完毕,之后就可以编
译了。
3.对一个简单程序的调试过程
1.假设准备编制进行如下计算任务的一个简单程序:
在已知x=3、y=5的情况下,先计算出x与y的和s,差d,商q,模r,而后计算res=s+2d+3q+4r的值(res应该等于16)并显示在屏幕上。
但编制的如下程序运行后却得出了一个错误结果“res=26”。
1.#include
2.voidmain()
3.{
4.intx=3,y=5;
5.ints,d,q,r,res;
6.s=x+y;
7.d=s-y;
8.q=x/y;
9.r=x%y;
10.res=s+2*d+3*q+4*r;
11.printf("res=%d\n",res);
12.}
复制代码
分析上述所编制的程序行,假设能在要输出res结果值的那一程序行(倒数第二行)处设置一个临时断点,让程序先执行到此断点处(注意设为断点的那一行尚未被执行!
),看一看那时各变量的动态取值情况,有可能就会找到出错的原因!
基于上述分析,先将鼠标光标移动到“printf("res=%d\n",res);”那一行处(左键单击那一行任意位置),从而指定了临时性断点的行位置,而后执行“Build→StartDebug→RuntoCursor”选项,使程序运行到所指定行时暂停其执行,并显示出如图3-2的界面,其中的左下方窗口中就列出了当时各变量的取值情况:
和s=8,差d=3(x=3,y=5,它们的差d=3肯定是错误的!
),商q=0,模r=3,最终结果res=26。
再仔细查看程序中负责计算差d的那一个语句“d=s-y;”就会恍然大悟,原来将“x-y”误写成了“s-y”!
找到了错误,此时可以通过菜单选项“Debug→StopDebugging”,中断当前的调试过程并返回正常的编辑状态,修改所发现的错误后,再一次执行将能得出正确结果“res=16”。
顺便指出,图3-2中显示的变量是“自动查看”方式的,即VC6自动显示当前运行上下文中的变量的值。
如果变量比较多,自动显示的窗口比较混乱,则可以在Watch列表中添加自己想要监控的变量名。
上述设置临时断点(到鼠标光标那一行处)的调试手段使用起来很方便,会经常使用(也经常在到达一个断点后,又设置另一个新的临时断点)。
另外也常配合使用“单步执行”的方式,来仔细检查每一步(一个程序行)执行后各变量取值的动态变化情况,如,先通过“RuntoCursor”执行到某一个鼠标光标临时断点行处,而后通过使用Debug菜单的“StepOver”或“StepInto”来进行所谓的“单步执行”,当然,每执行一步后,都要仔细观察并分析系统自动给出的各变量取值的动态变化情况,以便及时发现异常而找到出错原因。
4.如何对C语言设计合适的程序调试方案
让我们来分析并设计对如下程序进行调试的具体方法与手段(实际上,对不同的程序,都需要在分析其执行结果以及其程序编写结构的基础上,来设计相应的对其进行具体调试的方法与手段,宗旨是想方设法逐步缩小“侦察”范围,直到最后找到出错位置)。
该程序除main外,还有一个自定义函数f。
若已经能确认调用f函数前计算出的res值(或s、d、q或r其中之一的结果值)不正确的话,则可像上一程序那样,在计算出res变量值的下一行(或在靠前一些的某一行)处设置断点,看到达那一断点处是否一切正常。
若到达断点处的数据结果已经不正常的话,错误已经出现(出现在跟前或出现在前面,从而找到了错误或者缩小了“侦察”范围);若断点处仍然正常,可断言错误出现在后面,而后,①可又一次通过鼠标光标往更靠后一些的适当位置设置新断点,再一次“Debug→RuntoCursor”(一下向后“迈”过了许多行,再继续“侦察”!
);②通过“单步执行”(Debug→StepOver),在重点怀疑的那一块地方仔细地逐行进行“侦察”。
注意,“StepOver”不会“跟踪”进入f函数内部,若怀疑f函数可能有问题的话,要通过使用“Debug→StepInto”进入f内部再进行细致调试(在不遇到函数调用的地方,“StepOver”与“StepInto”的功能是相同的。
若通过“StepInto”进入到函数内部,单步执行若干步之后,若发现不再需要进行单步调试的话,可通过“StepOut”从函数内部返回到调用语句的下一语句处)。
此外设置固定性断点最简单的方法是:
在某一程序行处,单击鼠标右键,在菜单中选择“Insert/RemoveBreakpoint”项(通过左键单击该选项,此时该行前将出现一个圆形的黑点标志,意味着已经将该行设置成了固定断点)。
清除固定性断点的方法为:
在具有圆形黑点标志的固定断点行处,单击鼠标右键,在菜单中选择“RemoveBreakpoint”项(通过左键单击该选项,此时该行前的那一个圆形黑点标志将消失,意味着已经清除了该固定断点)。
设置了固定性断点后,通常通过“Build→StartDebug→Go”或“Debug→Go”选项使程序开始执行,直到遇到某断点或遇到程序结束而停止。
还要说明的是,可以随时设置任意多个固定性断点,也可以随时清除它们。
通过使用菜单选项“Edit→Breakpoints”,会出现一个对话框,在其中的“Breakat”文本框中键入要设置断点的程序行的行数信息(但通常是先通过鼠标光标选定某一程序行,再利用菜单选项进入上述对话框,而后通过点击“Breakat”文本框右边的小三角按钮,并选定系统自动提供的程序行的行数,以免自己要真正地去数清楚那一行的行数),也能够在指定行处设置一个固定性断点(通过OK按钮确定);如果要清除某断点,可在“Breakpoints”列表栏中先选定它,之后单击Remove按钮。
实际上,除位置断点外,通过“Edit→Breakpoints”,还可以设置数据断点,消息断点,以及条件断点等,这儿就不再细说了。
5.优秀C程序员的基本素质——丰富的想象、严谨的思维
(1)程序运行结果看起来对了,但并不意味着程序没有隐藏的问题
①以下程序是从键盘输入一个数(x,x是一个int型整数),计算y(y=1000x+9)并在屏幕上输出,程序基本上是对的,能输出正确的结果。
13.#include
14.voidmain()
15.{
16.int x,y;
17.printf("Pleaseinputx:
");
18.scanf("%d",&x);
19.y=1000*x+9;
20.printf("y=%d\n",y);
21.}
22.但是,当x输入为5000000,屏幕上却输出y=705032713,出现了错误。
23.
复制代码
②以下程序的功能是从键盘上读入一串字符,然后在屏幕上输出。
24.#include
25.voidmain()
26.{
27.char str[10];
28.printf("Pleaseinputstr:
");
29.scanf("%s",&str);
30.printf("str=%s\n",str);
31.}
复制代码
若用户在输入str时不小心多按了(或无意碰触)几下键盘,则程序运行会出错,如图3-3所示——可能稍严重的是程序运行死机(不报错),特别严重的是若有人精心设计输入的字符,完全可能造成系统被入侵或被严重破坏。
③以下程序的功能是从计算班中男生(boy)和女生(girl)的比例。
如果女生数为0时,程序会怎样?
32.#include
33.voidmain()
34.{
35.intboy,girl;
36.printf("Pleaseinputboy,girl:
");
37.scanf("%d,%d",&boy,&girl);
38.printf("boy/girl=%.2f\n",boy*1.0/girl);
39.}
复制代码
实际工作中,类似的隐藏的问题往往是破坏力巨大的“地雷”,往往造成极大的损失,例如火箭发射、宇宙飞船飞行、高速列车运行中的事故,我们平常接触最多的恐怕是微软的各种系统需要不断地打补丁。
因此,在程序设计中,必须缜密考虑各种情况,哪怕是机率极小的意外。
(2)严谨思维的典范——程序员学习的榜样
丰富的想象力、严谨的思维是一个优秀的程序应当具备的素质。
设计程序时不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,并且考虑全面、思维严谨。
以下2个小故事,应当是一个优秀程序员的标准思维,它形象、幽默、充分地展示了一个优秀程序员的严谨、全面的思维。
一个优秀的程序员只有这样思考并设计程序,才能保证程序始终能可靠、稳定地工作,减少和避免发生事故。
①方程仅仅对于正实数的简单情形成立
物理教授走过校园,遇到数学教授。
物理教授在进行一项实验,他总结出一个经验方程,似乎与实验数据吻合,他请数学教授看一看这个方程。
一周后他们碰头,数学教授说这个方程不成立。
可那时物理教授已经用他的方程预言出进一步的实验结果,而且效果颇佳,所以他请数学教授再审查一下这个方程。
又是一周过去,他们再次碰头。
数学教授告诉物理教授说这个方程的确成立,"但仅仅对于正实数的简单情形成立。
"
②判断开枪后树上还有几只鸟
某日,老师在课堂上想看看一学生智商有没有问题,问他“树上有十只鸟,开枪打死一只,还剩几只?
”
他反问“是无声手枪或别的无声的枪吗?
”(例如激光枪)
“不是。
”
“枪声有多大?
”
“80-100分贝。
”
“那就是说会震的耳朵疼?
”
“是。
”
“在这个城市里打鸟犯不犯法?
”
“不犯。
”
“您确定那只鸟真的被打死啦?
”
“确定。
”偶已经不耐烦了“拜托,你告诉我还剩几只就行了,OK”
“OK,树上的鸟里有没有聋子?
”
“没有。
”
“有没有关在笼子里的?
”
“没有。
”
“边上还有没有其他的树,树上还有没有其他鸟?
”
“没有。
”
“有没有残疾的或饿的飞不动的鸟?
”
“没有。
”
“算不算怀孕肚子里的小鸟?
”
“不算。
”
“打鸟的人眼有没有花?
保证是十只?
”
“没有花,就十只。
”偶已经满脑门是汗,且下课铃响,但他继续问
“有没有傻的不怕死的?
”
“都怕死。
”
“会不会一枪打死两只?
”
“不会。
”
“所有的鸟都可以自由活动吗?
”
“完全可以。
”
“如果您的回答没有骗人,”学生满怀信心的说,“打死的鸟要是挂在树上没掉下来,那么就剩一只,如果掉下来,就一只不剩。
”
老师当即晕倒。
6.VC6.0常见编译错误提示
(1)errorC2001:
newlineinconstant
编号:
C2001
直译:
在常量中出现了换行。
错误分析:
40.①字符串常量、字符常量中是否有换行。
41.②在这句语句中,某个字符串常量的尾部是否漏掉了双引号。
42.③在这语句中,某个字符创常量中是否出现了双引号字符“"”,但是没有使用转义符“\"”。
43.④在这句语句中,某个字符常量的尾部是否漏掉了单引号。
44.⑤是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。
(2)errorC2015:
toomanycharactersinconstant
编号:
C2015
直译:
字符常量中的字符太多了。
错误分析:
单引号表示字符型常量。
一般的,单引号中必须有且只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。
另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如:
if(x=='x||x=='y'){…}
值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASC码作为一个整数(int,4B)整体看待的数字。
(3)errorC2137:
emptycharacterconstant
编号:
C2137
直译:
空的字符定义。
错误分析:
原因是连用了两个单引号,而中间没有任何字符,这是不允许的。
(4)errorC2018:
un