当前位置:文档之家› C语言程序编辑或调试中常见的错误

C语言程序编辑或调试中常见的错误

C语言程序编辑或调试中常见的错误
C语言程序编辑或调试中常见的错误

常见错误和程序分析

(1)忘记定义变量。例如:

void main()

{

x=3;

y=6;

printf(“%d\n”,x+y);

}

C要求对程序中用到的美一个变量都必须定义其类型,上面程序中没有对x,y 进行定义。应在函数体的开头加int x,y;

(2)输入输出的数据类型与所用格式说明符不一致。例如,若a已定义为整数,b已定义为实型:

a=3;b=4.5; /*对a和b赋值*/

printf(“%f %d\n”,a,b);

编译时不给出出错信息,但运行结果将与原意不符,输出为0.000000 16402它们并不是按照赋值的规则进行转换(如把4.5转换为4),而是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后2个字节中的数据按%d作为整数输出)。

(3)未注意int型的数据的数值范围。Turbo C等编译系统,对一个整型数据分配2个字节。因此一个整数的范围为-2的13次方到2的15次方减1,即-32768~32767常见这样的程序段:

int num;

num=89101;

printf(“%d”,num);

得到的却是23565,原因是89101已超过32767。2个字节容纳不下89101,则将高位截去,即将超过低16位的数截去,也即89101-65536=23565,有时还会出现负数。这种情况应改为:

Long int num;

num=89101;

printf(“%ld”,num);

注意,如果只定义num为long型,而在输出时扔用%d说明符,也会出现以上错误。

(4)在输出语句scanf中忘记使用变量的地址符。例如:

scanf(“%d%d”,a,b);

这是很多初学者刚学C语言时常见的疏忽,应写为scanf(“%d%d”,&a,&b); (5)输入数据的形式与要求不符。例如有以下scanf函数:

scanf(“%d%d”,&a,&b);

有人输入 3 , 4 ,这是错的数据间应该用空格来分隔,读者可以用printf(“%d%d”,a,b);来验证下。应该输入 3 4,除非函数是scanf(“%d,%d”,&a,&b);

还应注意不能企图用

scanf(“input a & b:%d,%d”,&a,&b);

想在屏幕上显示一行信息:input a & b: 然后在其后显示a,b的值,这是不行的。可以改为:

printf(“input a & b :”);

scanf(“%d,%d”&a,&b);

(6)误把“=”作为“等于”运算符,“==”才是关系运算符“等于”。

(7)语句后面漏分号。

(8)在不该加分号的地方加分号。例如if,for,while语句中,不应有分号,切勿画蛇添足。

(9)对应该有花括号的复合语句,忘记加花括号。例如

sun=0;

i=1;

while(i<=100)

sum=sum+I;

i++;

这时候,其实有些人已看出问题了,就是while语句后没有花括号。

(10)括号不配对。当一个语句中使用多层次括号时常出现这类错误,纯粹粗心。while((c=getchar()!=’#’)

putchar(c);

(11)在用标识符时忘记打写字母和小写字母的区别。例如:

void main()

{int a ,b ,c;

a=2;b=3;

C=A+B;

printf(“%d+%d=%d”,A,B,C);

}编译时出错,编译程序把a和A 认作是两个不同的变量名处理,

(12)引用数组元素时误用了圆括号。例如:

void main()

{int i,a[10];

for(i=0;i<10;i++)

scanf(“%d”,&a(i));

}

(13)在定义数组时,将定义的“元素个数”误认为是“可使用的最大下标值”例如:void main()

{ int a[10]={1,2,3,4,5,6,7,8,9,10};

int i;

for(i=1;i<=10;i++)

printf(“%d”,a[i]);

}

想输出a[1]到a[10]。C语言规定定义时用a[10]表示a数组有10个元素,是从a[0]到a[9],因此用a[10]就超出a数组的范围了。

(14)对二维或多维数组的定义和引用方法不对。例如:

void main()

{int a[5,4];

printf(“%d”,a[1+2,2+2]);

}

a[5,4]是错的,应改为a[5][4],同样a[1+2,2+2]也是错的。

(15)误以为数组名代表数组中全部元素。例如:

void main()

{int a[4]={1,3,5,7};

printf(“%d%d%d%d\n”,a);

}

在C语言中数组名代表数组首地址,不能通过数组名输出4个整数。

(16)混淆字符数组与字符指针的区别。例如:

void main()

{char str[4];

str=”Compute and c”;

printf(“%s\n”,str);

}

编译出错。str是数组名,代表数组首地址。在编译时对str数组分配了一段内存单元,因此在程序运行期间str是一个常量,不能再被赋值。如果把“char str[4];”改成“char *str;”,程序则正确。

(17)在引用指针变量之前没有对它赋予确定的值。例如:

viod main()

{char *p;

scanf(“%s”,p);

`

`

}

没有给指针变量p赋值就引用它,编译时给出警告信息。应当改为

char *p,c[20];

p=c;

scanf(“%s”,p);

(18)switch语句的各分支中漏写break语句。

(19)混淆字符和字符串的表示形式。例如:

char sex;

sex=”M”;

`

`

sex是字符变量,只能存放一个字符,而字符常量的形式是用单撇号括起来的,应改为sex=’M’;

(20)使用自加(++)和自减(--)运算符时出的错误。例如:

void main()

{ int *p,a[5]={1,3,5,7,9};

p=a;

printf(“%d”,*p++);

}

不少人认为“*p++”的作用是先使p加1,即指向第1个元素a[]处,然后输出第一个元素a[1]的值3.其实应该是先执行p++,而p++的作用是先用p的原值,用完后是p加1,。p的原值指向数组a的第0个元素a[0],因此*p就是第0个元素a[0]的值1。结论是先输出a[0]的值,然后再使p加1.如果是*(++p),则先使p指向a[1],然后输出a[1]的值。

(21)还有很多常见的错误,在这里就不一个一个的举例了,如

①所调用的函数在调用语句之后才定义,而又在调用之前未声明。

②对函数声明与函数定义不匹配。

③需要加头文件时没有用#include命令去包含头文件。例如:

程序中用到fabs函数,没有用#include

④误认为形参值的改变会影响实参的值。

⑤函数的实参和形参类型不一样。

⑥不同类型的指针混用。

⑦没有注意函数参数的求值顺序。

⑧混淆数组名与指针变量的区别。

⑨混淆结构体类型与结构体变量的区别,对一个结构体类型赋值。

⑩使用文件时忘记打开,或打开方式与使用情况不匹配。

(22)程序错误其实有3中情况:?语法错误;?逻辑错误;?运行错误。

C语言调试常见错误

C语言调试常见错误 一、第一类错误分析 1在使用变量前未定义。 例如: main() {a=1; b=2; printf(″%d\n″, a+b); } 2语句后面漏写分号或不该加分号的地方加了分号。 C语言规定,语句必须以分号结束,分号是C语句不可缺少的一部分,这也是和其它高级语言不同的一点。初学者往往容易忽略这个分号。 如: x=1 y=2; 又如在复合语句中漏写最后一个语句的分号: {t=x; x=y; y=t } 3不该有空格的地方加了空格 例如,在用/*...*/对C程序中的任何部分作注释时,/与*之间都不应当有空格。 又如,在关系运算符<=,>=,==和!=中,两个符号之间也不允许有空格。 4定义或引用数组的方式不对。 C语言规定,在对数组进行定义或对数组元素进行引用时必须要用方括号(对二维数组或多维数组的每一维数据都必须分别用方括号括起来),例如以下写法都将造成编译时出错: int a(10); int b[5,4]; printf(″%d\n″, b[1+2,2]); 5混淆字符和字符串 C语言中的字符常量是由一对单引号括起来的单个字符;而字符串常量是用一对双引号括起来的字符序列。字符常量存放在字符型变量中,而字符串常量只能存放在字符型数组中。例如, 假设已说明num是字符型变量,则以下赋值语句是非法的: num=″1″; 6在引用数组元素或指针变量之前没对其赋初值。 例如: main() main() {int a[6],b; {int *ptr, i=1; b=a[5]; *ptr=i

┇ ┇ }} 以上两个程序段在编译时均会出现警告信息。 7混淆数组名与指针变量 在C语言中,数组名代表数组的首地址,它的值是一个常量,不能被修改。例如,在以下程序段中,用a++是不合法的。 main() {int i, a[10]; for (i=0;i<10;i++) scanf(″%d″, a++); ┇ } 8混淆不同类型的指针。 若有以下语句: int *p1, a=1; float *p2; p1=&a; 则赋值语句p2=p1是非法的。 9混淆指针说明语句中的*号和执行语句中的*号。 设有以下说明语句: int *p1, i=1; 则 *p1=&i;是不合法的。 10误将函数形参和函数中的局部变量一起定义。 例如: fun(x,y) float x, y, z; {x++; y++; z=x+y; ┇ } 11所调用的函数在调用前未定义。 main() {float a=10, b=20, c; c=fun(a,b); ┇ } float fun(x, y) float x, y; {x++; y++; ┇ } 12混淆结构体类型名和结构体变量名。 若定义了以下结构体类型student:

C语言调试常见错误及修改方法(附习题)

1.调试 C 程序时常见的错误类型分析 一般情况下,错误主要分为两大类:一、语法错误。对于这种错误,用编译器很容易解决。所以,改错题的第一步是先编译,解决这类语法错误。下面总结了二级C 语言上机改错题中常见的语法错误: (1) 丢失分号,或分号误写成逗号。 (2) 关键字拼写错误,如本来小写变成大写。 (3) 语句格式错误,例如for 语句中多写或者少写分号。 (4) 表达式声明错误,例如:少了() (5) 函数类型说明错误。与main ()函数中不一致。 (6) 函数形参类型声明错误。例如:少* 等。 (7) 运算符书写错误,例如:/ 写成了。二、逻辑错误,或者叫语义错误,这和实现程序功能紧密相关,一般不能用编译器发现。对于逻辑错误可以按这样的步骤进行查找。 (1) 先读试题,看清题目的功能要求。 (2) 通读程序,看懂程序中算法的实现方法。 (3) 细看程序,发现常见错误点。 2.改错题的改错方式总结,当然这些总结只能对大部分改错行有效 1、若错误行是函数首部,可分为以下几种情况: A、该行最后若有分号则删除,中间若有分号则改成逗号 B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m 个元素的指针变量,则第二维的长度必须与main 中对应数组的第二维长度相同 C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return 后变量的类型一致。 2、若错误行是if 或while 语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。 3、若错误行中有if、while 、for 则要特别注意条件表达式的错误问题: A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符 B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号 C、f or 中要用分号分隔表达式,而不是用逗号 4、语法错误 A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。 B、大小写不对,若错误行中有大写字母则一般都改成小写字母。 5、指针变量的运用,若错误行中有指针变量,并且该变量名前没有指针运算符则一般都是加上指针运算符 6、若错误行为return 语句,则首先看是否是缺少分号若是则加上分号即可;否则就是return 后的变量或表达式错误(此时可通过看题意,来分析该返回哪一变量或表达式)

C语言程序设计实验实验指导书及答案

实验一熟悉C程序运行环境 班级学号姓名成绩 一、实验目的 1. 熟悉C语言Visual C++调试环境。 2. 掌握C程序的编辑、调试及运行。 二、实验内容 项目1. 调试并运行下面程序,并写出运行结果: #include <> int main() { printf(“Good morning!\n”); printf(“Hello,world!\n”); return 0; } 运行结果(注意,按照屏幕输出格式写): 项目2. 调试并运行下面程序,并写出运行结果: #include <> int main() { int a , b , sum; /*定义变量*/ a=23; b=56; /*为变量赋值*/ sum=a+b; /*计算两个变量的和*/ printf(“sum is %d\n”,sum); /*输出计算结果*/ return 0; } 运行结果:

项目3. 调试并运行下面程序,并写出运行结果: #include <> int max(int,int); int main() { int a , b , c; /*定义变量*/ a=23; b=56; /*为变量赋值*/ c=max(a,b); /*调用max函数,将得到的值赋给c*/ printf(“max is %d\n”,c); /*输出c的值*/ return 0; } int max(int x,int y) /*定义max函数,函数值为整型*/ { int z; /*定义变量*/ if(x>y) z=x; else z=y; return(z); /*将z的值返回*/ } 运行结果: 三、提高部分 1.试想,如果求10个数中的最大者,则程序该如何编写。 程序代码 运行结果:

DSP调试及烧写和加载常见错误及分析

Error: Read status value 0x0001 from symbol PRG_status Flash algorithm failed during clear operation 开始可以正常烧写的,但是上机调试了一下就不能写了. 在烧写lf2407内部flash时出现如下错误,不知是什么原因造成的? Error:Read status value 0x0001 from symbol PRG_status Flash algorithm failed during clear operation. 换了一个芯片后正常 之前有一次在试CCS功能时,一不小心点了一次加密,还没有执行完,就马上点了解密,大概这样烧坏了吧! 太脆弱了,再也不敢试加密了 CMD文件要避开FLASH的40H--44H区间, 我也出现过这样的问题,烧写2407A的片内flash时会出现下面的错误提示:Error: Read status value 0x0001 form symbol PRG_status Flash algorithm failed during clear operation 后来换了一块2407就能烧写了。 是不是2407的flash坏了?有没有办法检测或者修复flash? 昨天在网上查了一下,很多人都遇到了这种问题,可能是dsp内部flash烧坏了吧! 今天重新换了一块芯片,可以烧录进去了,但是上拿到样机上调试一下,再烧录就出现了同样的问题,估计又是flash坏了,到底是什么原因引起的?是不是电源引起的呢? 我也出现过能仿真,但不能烧写的情况!解决方法: 解决方法:降低时钟频率。点击FLASH插件上的“View Config File”,打开VAR.h文件。将该文件中的“PLL_PATIO_CONST .Set 0000h”改成 “PLL_PATIO_CONST .Set 0200h”存盘后,执行目录下的Buildall.bat批处理文件。再重新启动CCS及FLASH插件。 请教高手:在烧写程序的时候出现如下错误:Error: Read status value 0x0001 from s ymbol PRG_status Flash algorithm failed during clear operation

C语言调试时出现的错误及调整方法

VC中LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16错误2009-10-09 11:11 学习VC++时经常会遇到链接错误LNK2001,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。产生 LNK2001错误的原因:一个是由于编码错误导致的LNK2001,在这不想详细说.另一个由于编译和链接的设置而造成的LNK2001.最经常发生的是:"LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol",产生这个错误的原因是没有为wWinMainCRTStartup设定程序入口. 认识这个错误首先在新建工程时要分清Win32 Application和Win32 Console Application.它们都是工作在32位Windows环境的程序.其中Win32 Application 就是普通的常见的窗口应用程序,当然有的界面做得比较 个性化,比如圆形的、不规则形状的.它们都是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制。而Win32 Console Application (win32控制台应用程序)往往是像MS-DOS窗口(XP中叫命令提示符)的样子出现,我们得用键盘输入各种命令来使用它,或者叫CUI(Character User Interface字符用户接 口)。 遇到如下链接错误: Linking... /subsystem:windows LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 Debug/TestWin.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. 解决方法是:将project-settings-link的project options里的/subsystem:windows 改成/subsystem:console 因为Win32 Application的入口函数为WinMain Win32 Console Application的入口函数是main 也就是说,如果你编写传统的C程序,必须建立Win32 Console程序,但VC里面默认的是Win32 Application,于是上面提及的链接错误就就经常出现了 而Win32 Application和Win32 Console的区别就在于VC里链接参数不同 另外几种error LNK2001错误: 在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex 下面介绍解决的方法: 1. Windows子系统设置错误, 提示: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

ccs33中建立-编译-调试工程及常见错误讲解.

Part1:ccs3.3中新建一个DM6437的示例工程 1、连接好板子,将板子上仿真器的usb口插到电脑上,启动ccs后,ccs会去获取板子信息并在打开的文件目录中自动生成一个文件,如图所示:笔者使用的是6437的板子 2、用file-new选择建立一个dsp/bios文件 在打开的对话框中选择你使用的板子的型号,如下图: 3、这个时候ccs为我们建立了一个bios文件,以图表显示,里面按照所选板子的类型添加相应的硬件和其他模块。保存这个文件到工程目录下先,文件类型为tcf。 4、保存这个文件的同时,ccs按照bios中的配置在当前目录下自动生成了一个cmd文件。此时将tcf文件和这个cmd文件同时添加到工程中,使用 5、然后需要修改一个编译选项,点击下图所示选项进去:

6、打开后在编译选项对话框总会看到一个命令行,其中最后一句是-mv6400,因为用的是6467的板子,所以这个选项要修改成-mv64+;否则编译会报错:编译选项不正确;但并非所有类型的板子都要改,这个只针对型号为64+的板子。 7、file-new-source file建立一个c源文件,保存并加入到工程中。 以下是示例程序: #include #include #include Int main(Int argc, String argv[])//main函数的类型必须这样写 { unsigned int i; unsigned int sum=0; for(i = 0; i<=100; i++ ) {

sum += i; } printf("the sum = %d .\n",sum); printf("the program run over!\n"); printf("the program run over!\n");} 注意:1)如果想要printf正确输出信息,需要添加对应平台的rts64plus.lib文件。这里是64+平台所以是在C:\CCStudio_v3.3\C6000\cgtools\lib目录下的rts64plus.lib文件,否则ccs 会提示如下警告和错误: >> warning: entry point symbol _c_int00 undefined undefined first referenced symbol in file --------- ---------------- _printf E:\\WorkContent\\projectExample\\Test\\Debug\\test.obj >> error: symbol referencing errors - './Debug/Test.out' not built 2)如果想要printf正确输出信息,cmd文件中必须指定heap的大小,即cmd文件这样写: -c -stack 0x00001000 /* Stack Size */ -heap 0x00001000 /* Heap Size */ //前面这三项必不可少 MEMORY { L2RAM: o = 0x10800000 l = 0x00020000 DDR2: o = 0x80000000 l = 0x10000000 } SECTIONS { .bss > L2RAM .cinit > L2RAM .cio > L2RAM .const > L2RAM .data > L2RAM .far > L2RAM .stack > L2RAM .switch > L2RAM .sysmem > L2RAM .text > L2RAM .ddr2 > DDR2 }

程序调试与常见程序错误

程序调试与常见程序错误 目录 一、在Codeblocks中调试程序 (1) 二、存储路径设置问题 (4) 三、修改Codeblocks的设置 (4) 四、提示程序无法调试问题 (6) 五、常见错误分析 (6) 六、程序出错的三种情况 (18) 七、常用的纠错方式 (19) 一、在Codeblocks中调试程序 1.注意事项 不允许工程路径中含有空格、汉字。 2.在相应行号后面点击鼠标左键设置断点 3.打开W ATCHS窗口

4.点击调试按钮 5.可以再watchs窗口看到自动变量。黄色三角表示程序暂停的位置

6.通过单步运行按钮进行单步运行。 7.也可以在debuger标签,command栏输入调试命令进行单步运行、打印变量值等操作。 8.程序运行

二、存储路径设置问题 1. 如果不是默认安装路径,code blocks 就无法找到编译器和调试器,就会出现此类问题。 解决办法:Settings——Compiler and debugger——Toolchain executables——Auto-detect。 2. 输出信息为“某个命令执行失败或异常终止”。 解决方法:通常是相应的编译器找不到,试着将其所在路径放到path环境变量中去。 3. 输出编译错误,如某某文件找不到之类。 解决方法:在项目中设置选项中加上路径(通常可利用customer variable项)。 4. 在调试程序的时候弹出类似""XYZ - Debug": The compiler's setup (GNU GCC Compiler) is invalid, so Code::Blocks cannot find/run the compiler. Probably the toolchain path within the compiler options is not setup correctly?! Goto "Settings->Compiler and debugger...->Global compiler settings->GNU GCC Compiler->Toolchain executables" and fix the compiler's setup. Skipping... Nothing to be done (all items are up-to-date)."这种警告。 解决方法:这个错误提示已经说得很清楚了, 找不到编译器, 到菜单Settings->Compiler and debugger...->Global compiler settings->GNU GCC Compiler->Toolchain executables下去修复编译选项前提是你已经装了gcc 如过没装, 就去下个包含mingw的codeblocks, (mingw包含gcc编译器); 三、修改Codeblocks的设置 1.

c语言错误调试大全

A Ambiguous operators need parentheses 不明确的运算需要用括号括起。二义性操作符需要括号,但两个移位、关系或按位操作符在一起使用而不加括号时,发现此警告;但一个加法或减法操作符不加括号而与一个移位操作符出现在一起时,也发出此警告。 Ambiguous symbol ''xxx'' 不明确的符号,二义性符号…xxxxxxxx?。两个或多个结构的某一域名相同,但具有的偏移、类型不同。在变量或表达式中引用该域而未带结构名时,将产生二义性,此时需修改某个域名或在引用时加上结构名。 Argument list syntax error 参数表语法错误参数表出现语法错误。函数调用时,参数与参数之间必须以逗号隔开,并以一右括号结束。若源文件中含有一个其后不是逗号也不是右括号的参数,则出错。 Argument #missing name 参数#名丢失。参数名已脱离用于定义函数的函数原型,如果函数以原型定义,该函数必须包括所有的参数名。 Array bounds missing 丢失数组界限符数组的界限符…]?丢失。原因是在源文件中定义了一个数组,但此数组没有以一右方括号结束。, Array size toolarge 数组尺寸太大,数组长度太长。定义的数组太大,而可用内存不够。Assembler startement too long 汇编语句太长。内部汇编语句最长不能超过480个字节。 B Bad call of in line function 内部函数非法调用 在使用一个宏定义的内部函数时,没有正确调用。一个内部函数以下划双线(_)开始和结束。 Bad character in paramenters 参数中有不适当的字符 Bad configuration file 配置文件不正确。Turboc.cfg配置文件中包含不是合适命令行选择项非注解文字。 配置文件命令选择项必须以一短横线开始。 Bad file name format in include directive 包含命令中文件名格式不正确使用include指令时,文件名格式不正确。include 文件名必须用引号或尖括号括起来。例如:include "stdio.h"或include ,否则将

C语言调试常见错误及修改方法(附习题)

1.调试C程序时常见的错误类型分析 一般情况下,错误主要分为两大类: 一、语法错误。对于这种错误,用编译器很容易解决。所以,改错题的第一步是先编译, 解决这类语法错误。下面总结了二级C语言上机改错题中常见的语法错误: (1)丢失分号,或分号误写成逗号。 (2)关键字拼写错误,如本来小写变成大写。 (3)语句格式错误,例如for语句中多写或者少写分号。 (4)表达式声明错误,例如:少了() (5)函数类型说明错误。与main()函数中不一致。 (6)函数形参类型声明错误。例如:少*等。 (7)运算符书写错误,例如:/写成了\。 二、逻辑错误,或者叫语义错误,这和实现程序功能紧密相关,一般不能用编译器发现。 对于逻辑错误可以按这样的步骤进行查找。 (1)先读试题,看清题目的功能要求。 (2)通读程序,看懂程序中算法的实现方法。 (3)细看程序,发现常见错误点。 2.改错题的改错方式总结,当然这些总结只能对大部分改错行有效。 1、若错误行是函数首部,可分为以下几种情况: A、该行最后若有分号则删除,中间若有分号则改成逗号 B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m个元素的指针变量,则第二维的长度必须与main 中对应数组的第二维长度相同 C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return后变量的类型一致。 2、若错误行是if或while语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。 3、若错误行中有if、while、for则要特别注意条件表达式的错误问题: A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符 B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号 C、for中要用分号分隔表达式,而不是用逗号 4、语法错误 A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。 B、大小写不对,若错误行中有大写字母则一般都改成小写字母。

C语言程序编辑或调试中常见的错误

常见错误和程序分析 (1)忘记定义变量。例如: void main() { x=3; y=6; printf(“%d\n”,x+y); } C要求对程序中用到的美一个变量都必须定义其类型,上面程序中没有对x,y 进行定义。应在函数体的开头加int x,y; (2)输入输出的数据类型与所用格式说明符不一致。例如,若a已定义为整数,b已定义为实型: a=3;b=4.5; /*对a和b赋值*/ printf(“%f %d\n”,a,b); 编译时不给出出错信息,但运行结果将与原意不符,输出为0.000000 16402它们并不是按照赋值的规则进行转换(如把4.5转换为4),而是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后2个字节中的数据按%d作为整数输出)。 (3)未注意int型的数据的数值范围。Turbo C等编译系统,对一个整型数据分配2个字节。因此一个整数的范围为-2的13次方到2的15次方减1,即-32768~32767常见这样的程序段: int num; num=89101; printf(“%d”,num); 得到的却是23565,原因是89101已超过32767。2个字节容纳不下89101,则将高位截去,即将超过低16位的数截去,也即89101-65536=23565,有时还会出现负数。这种情况应改为: Long int num; num=89101; printf(“%ld”,num); 注意,如果只定义num为long型,而在输出时扔用%d说明符,也会出现以上错误。 (4)在输出语句scanf中忘记使用变量的地址符。例如: scanf(“%d%d”,a,b); 这是很多初学者刚学C语言时常见的疏忽,应写为scanf(“%d%d”,&a,&b); (5)输入数据的形式与要求不符。例如有以下scanf函数: scanf(“%d%d”,&a,&b); 有人输入 3 , 4 ,这是错的数据间应该用空格来分隔,读者可以用printf(“%d%d”,a,b);来验证下。应该输入 3 4,除非函数是scanf(“%d,%d”,&a,&b); 还应注意不能企图用

C语言调试功能以及常见错误提示详解

C语言编译环境中的 调试功能及常见错误提示 调试功能 1.常用健 : 激活系统菜单 : 将光标在编辑窗口和、信息窗口之间切换 : 加载一个文件 + : 查看程序运行结果 : 得到有关编辑器在线帮助 + : 得到有关C语言的在线帮助 + : 终止正在运行的程序 2.块操作 KB: 定义块首 KK: 定义块尾 KV: 块移动 KC: 块复制 KY: 块删除 KH: 取消块定义 3.查找、替换和删除操作 QF: 查找字符串 QA: 查找并替换字符串 Option: G(全程),B(向文件头),N(直接替换) Y : 删除一行 QY: 删除从光标位置到行末的所有字符 编译中的常见错误例析 (1) 警告类错误 …XXX?declare but never used变量XXX已定义但从未用过。 …XXX?is assigned a value which is never used变量XXX已赋值但从未用过。 Code has no effect 程序中含有没有实际作用的代码。 Non-portable pointer conversion不适当的指针转换,可能是在应该 使用指针的地方用了一个非0的数 值。 Possible use of …XXX?before definition表达式中使用了未赋值的变量 Redeclaration of …main?一个程序文件中主函数main不止一个。 Suspicious pointer conversion可疑的指针转换。通常是使用了基本类型不匹配的指针。 Unreachable code程序含有不能执行到的代码。 (2) 错误或致命错误 Compound statement missing } in function main程序结尾缺少括号}。

调试与错误处理

第9章调试与错误处理 一、问答题 1.请思考如何避免错误。 答:1)事先精心设计应用程序,描述清楚相关事件以及代码响应每一事件的方法,为每一事件过程和每个普通过程都指定一个特点的、明确的目标。 2)多加注释。如果用注释说明每个过程的目的,在以后分析代码时,能更深入地理解这些代码。 3)对过程中用到的每个变量或对象都应该在过程开始部分加以定义。 4)在应用程序中对变量和对象提出一种前后一致的命名方案。 2.请简要设计错误处理程序的三个步骤。 答:1)捕获错误,并强制程序跳转 2)编写错误处理程序 3)退出错误处理程序 3.简述常用的程序调试技巧。 答:1)事先做好备份; 2)分离受怀疑的程序; 3)缩小搜索范围; 4)使用MsgBox语句。 4.简要说明VB程序调试的主要方法和工具。 答:VB 程序调试的主要方法:用编译器提示错误;使用调试工具来发现和改正错误;采用常用的调试技巧,如事先做好备份,分离受怀疑的程序,缩小搜索范围,使用MsgBox语句等。 主要工具:“调试”菜单下的“逐语句”、“逐过程”、“跳出”、“运行到光标处”、“添加监视”、“快速监视”、“切换断点”等子菜单项。 5.VB程序错误大体可分为哪几种,它们的含义是什么? 答:VB程序错误大体分为三种:编译错误、实时错误和语法错误。 编译错误是在编写程序时书写了有错误的语法的代码,导致VB编译器无法正确解释源代码而产生的错误,也称语法错误。实时错误是指在运行期间,一跳语句试图执行一条不可能执行的操作而产生的错误,也称运行时错误。逻辑错误是指程序的运行结果和程序员的设想有出入时产生的错误。 6.请说明On Error GoTo 与On Error Resume Next 的区别。 答:On Error GoTo 行标识符语句:当发生错误时,使用该语句强制改变程序的执行方向。而On Error Resume Next 语句:当发生错误时,VB程序将忽略引发错误的语句,并继续执行下一条语句。 二、程序设计题 1.程序改错。以前面学到的冒泡排序算法为例,开发以下程序,请上机练习排除其中的错误。 1

STM 调试过程中常见的问题及解决方法

一、在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No ULINK Device foun d.” 解决办法:Keil MDK默认使用ULINK仿真器下载程序,在“Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。 二、编译工程时提示如下信息: main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10 x_nvic.o). main.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvi c.o). main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f 10x_nvic.o). main.axf: Error: L6218E: Undefined symbol __RESETPRIMASK (referred from stm32f10x _nvic.o). main.axf: Error: L6218E: Undefined symbol __SETFAULTMASK (referred from stm32f10x _nvic.o). main.axf: Error: L6218E: Undefined symbol __SETPRIMASK (referred from stm32f10x_n vic.o). 解决办法:工程缺少“cortexm3_macro.s”文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。 三、调试器不能连接到STM32的问题与解决办法 很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等。 这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块、或在调试低功耗模式的程序的时候。所谓“可以在CPU不干预的时候自动运行的模块”包括:DMA、定时器、连续转换模式下的ADC、看门狗等模块。 -------------------------------------------------------------------------------- 这个问题的根源是: 1. 调试器需要在RAM内执行一段程序,对Flash进行擦写操作,如果不停止这些自动运行的模块,它们会干扰程序在RAM中的执行,致使下载失败。比如DMA模块被配置为不停地拷贝一段数据区,而调试器刚好需要使用DMA数据传输的目标区域,这时DMA的操作将会与调试器的操作发生冲突。再比如,如果启动了看门狗而没有执行硬件复位,则在下次调试器需要下载程序时,看门狗超时将触发芯片复位,导致下载操作失败。 2. 低功耗是通过停止CPU的时钟而实现,JTAG调试是通过与CPU的通信实现,停止了C PU的时钟致使调试器会失去与CPU的通信。 --------------------------------------------------------------------------------

linux下C语言使用编译与调试试验

实验四:LINUX 下C语言使用、编译与调试实验 一、目的: 1、练习并掌握Linux提供的vi编辑器来编译C程序 2、学会利用gcc、gdb编译、调试C程序 3、学会使用make工具 二、内容 1、编写C语言程序,用gcc编译并观察编译后的结果,运行生成的可执行文件。 2、利用gdb调试程序。 3、学习编写makefile,并进行编译。 三、操作 1、文件编辑器vi 进入vi,直接执行vi编辑程序。 例:# vitest.c 显示器出现vi的编辑窗口,同时vi会将文件复制一份至缓冲区(buffer)。vi先对缓冲区的文件进行编辑,保留在磁盘中的文件则不变。编辑完成后,使用者可决定是否要取代原来旧有的文件。 1) vi的工作模式 (1)输入模式 输入以下命令即可进入vi输入模式: a 在光标之后加入资料 A 在该行之末加入资料 i 在光标之前加入资料 I 在该行之首加入资料 o 新增一行于该行之下 O 新增一行于该行之上 (2)命令模式 在输入模式下,按ESC可切换到命令模式。命令模式下,可选用下列指令离开vi::q! 离开vi,并放弃刚在缓冲区内编辑的内容 :wq 将缓冲区内的资料写入磁盘中,并离开vi ZZ 同wq :x 同wq :w 将缓冲区内的资料写入磁盘中,但并不离开vi :q 离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:w配合使用 (3)命令模式下光标的移动

h 左移一个字符 j 下移一个字符 k 上移一个字符 l 右移一个字符 0(零)移至该行的行首 $ 移至该行的行尾 ^ 移至该行的第一个字符处 H 移至窗口的第一行 M 移至窗口中间那一行 L 移至窗口的最后一行 G 移至该文件的最后一行 W, w 下一个单词(W 忽略符号) B, b 上一个单词(B 忽略符号) (4) 命令模式下的编辑命令 dd 删除当前光标所在行 yy 复制当前光标所在行 p 将复制的内容粘贴在光标所在的位置后 P 将复制的内容粘贴在光标所在的位置前 x 删除当前光标字符 X 删除当前光标之前字符 u 撤消 ·重做 2、GNU C编译器 1) 使用gcc 通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下: gcc [options] [] 命令行选项指定的编译过程中的具体操作 2) gcc常用选项 当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。 选项含义: -o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE 没有指定,默认文件名是a.out. 例如,

C语言上机程序调试功能键及常见错误提示

C语言上机程序调试功能键及常见错误提示 1.常用健 : 激活系统菜单 : 将光标在编辑窗口和、信息窗口之间切换 : 加载一个文件 +: 查看程序运行结果 : 得到有关编辑器在线帮助 + : 得到有关C语言的在线帮助 +: 终止正在运行的程序 2.块操作 KB: 定义块首 KK: 定义块尾 KV: 块移动 KC: 块复制 KY: 块删除 KH: 取消块定义 3.查找、替换和删除操作 QF: 查找字符串 QA: 查找并替换字符串 Option: G(全程), B(向文件头), N(直接替换) Y : 删除一行 QY: 删除从光标位置到行末的所有字符 4.编译中的常见错误 (1)警告类错误 ?‘XXX’declare but never used变量XXX已定义但从未用过。 ?‘XXX’is assigned a value which is never used变量XXX已赋值但从未用过。?Code has no effect 程序中含有没有实际作用的代码。 ?Non-portable pointer conversion不适当的指针转换,可能是在应该使用指针的 地方用了一个非0的数值。 ?Possible use of ‘XXX’before definition表达式中使用了未赋值的变量 ?Redeclaration of ‘main’一个程序文件中主函数main不止一个。 ?Suspicious pointer conversion可疑的指针转换。通常是使用了基本类型不匹配的指针。 ?Unreachable code程序含有不能执行到的代码。 (2)错误或致命错误 ?Compound statement missing } in function main程序结尾缺少括号}。 ??}?expected;?(?expected等复合语句或数组初始化的结尾缺少?)?;?(?。? Case outside of switch case不属于Switch结构,多由于switch结构中的花括 号不配对所致。 ?Case statement missing ‘:’ switch结构中的某个case之后缺少冒号。 ? Constant expression required定义数组时指定的数组长度不是常量表达式。 ? Declaration syntax error 结构体或联合类型的定义后缺少分号。

Visual C++6.0中的调试工具使用及常见错误

C语言常见错误及解决方法 (注:红色粗体是常见的错误,请大家检查自己的程序,并注意尽量不要犯这些常见的错误。其余它体是避免错误的方法和正确的写法) 一、基础知识和数据类型、表达式 1、拼写错误,尤其是include,main,void,float等词。C语言的32个关键字与基本含义如下:double:声明双精度变量或函数 int:声明整型变量或函数 char:声明字符型变量或函数 float:声明浮点型变量或函数 void:声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) auto:声明自动变量一般不使用 struct:声明结构体变量或函数 break:跳出当前循环 else:条件语句否定分支(与if连用) long:声明长整型变量或函数 switch:用于开关语句 case:开关语句分支 enum:声明枚举类型 register:声明积存器变量 typedef:用以给数据类型取别名(当然还有其他作用) extern:声明变量是在其他文件正声明(也可以看做是引用变量) return:子程序返回语句(可以带参数,也看不带参数) union:声明联合数据类型 const:声明只读变量 short:声明短整型变量或函数 unsigned:声明无符号类型变量或函数 continue:结束当前循环,开始下一轮循环 for:一种循环语句(可意会不可言传) signed:生命有符号类型变量或函数 default:开关语句中的“其他”分支 goto:无条件跳转语句 sizeof:计算数据类型长度 volatile:说明变量在程序执行中可被隐含地改变 do:循环语句的循环体 while:循环语句的循环条件 static:声明静态变量 if:条件语句 2、{},[],(),‘’,“”不配对。解决这个问题最好的方法就是每当写这些符号的时候就 先写成一对,然后再在中间加内容。 3、忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要 加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命

C语言各类提示错误的含义

Ambiguous operators need parentheses-----------不明确的运算需要用括号括起 Ambiguous symbol''xxx''----------------不明确的符号 Argument list syntax error----------------参数表语法错误 Array bounds missing------------------丢失数组界限符 Array size toolarge-----------------数组尺寸太大 Bad character in paramenters------------------参数中有不适当的字符Bad file name format in include directive--------------------包含命令中文件名格式不正确 Bad ifdef directive synatax------------------------------编译预处理ifdef有语法错 Bad undef directive syntax---------------------------编译预处理undef有语法错 Bit field too large----------------位字段太长 Call of non-function-----------------调用未定义的函数 Call to function with no prototype---------------调用函数时没有函数的说明 Cannot modify a const object---------------不允许修改常量对象 Case outside of switch----------------漏掉了case语句 Case syntax error------------------Case语法错误 Code has no effect-----------------代码不可述不可能执行到Compound statement missing{--------------------分程序漏掉"{"

相关主题
文本预览
相关文档 最新文档