程序调试中的常见问题及解决方法
2017-09-09 08:55
465 查看
1、CE(Compile Error)编译错误
其实很多时候通过返回的错误信息就能找出错误。
①缺失符号,如下图
第一句Error表示在“printf”前少了一个分号,
第二句Error表示在“return”前少了一个分号。
通常在错误行的上一行找缺失的分号。比如,
int main() { int sas //here; printf("%d",a[7]); if(1) a[0]=1 //here; return 0; }[/code]
根据代码和上面图片的信息,很容易判断错误在哪。
②缺失参数
比如这样:void f(int a) { ...... } int main() { f(); return 0; }[/code]
就会有这样的错误信
4000
息返回:
[Error] too few arguments to function ‘void f(int)’
说明我们在使用函数时给予的参数过少。
③如果使用了STL,并且是STL相关语句CE,那么错误信息可能很复杂。
但是不要怕,错误可能并不是多么复杂。所以下面说一个sort常见的问题。
#include<cstdio> #include<algorithm> using namespace std; struct A { int v,c; }a[15]; int main() { for(int i=1;i<=10;i++) scanf("%d",&a[i]); sort(a+1,a+11); }[/code]
然后就CE 了··· 而且错误信息辣么多QAQ
还会跳出来一串代码:
template<typename _RandomAccessIterator> void __insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) { if (__first == __last) return; for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) { if (*__i < *__first) { typename iterator_traits<_RandomAccessIterator>::value_type __val = _GLIBCXX_MOVE(*__i); _GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1); *__first = _GLIBCXX_MOVE(__val); } else std::__unguarded_linear_insert(__i); } }[/code]
看不懂啊QAQ
不过没关系,我们知道错误行是这个:
if (*__i < *__first){···}
啥意思呢?想想sort是用来干什么的?排序,对吧。而我们的a是一个结构体,里面包含着c,v两个数。
于是就得出结论:程序不知道按什么来排序了。
怎么办呢?手写cmp函数。
如果想按c排序,就这样:
bool cmp(A a,A b) { return a.c<b.c; }[/code]
然后把sort改一下:
sort(a+1,a+11,cmp);
就这样,编译通过!
2、RE(Running Error)运行时错误
图有点大=V=
具体来说有以下解决方法:
①检查在scanf中是否加入了%、&等必要符号。
②检查数组是否越界(数组下标为负数、数组下标过大)。
③如果使用了STL,请认真检查与STL相关的语句,不管是函数还是数据结构。
④如果使用了指针,检查指针是否初始化为NULL。
⑤检查是否递归了太多次,导致爆栈。
3、WA(Wrong Answer)
先想想自己算法的正确性吧。算法没错?看下面:
一、程序输出了意料之外的结果,如0、极大值。
①是不是数组没有赋初值?②是不是访问了非法内存(有时访问非法内存不会RE)?
③循环次数是否远远超过或低于预期?
④是不是爆int了?
二、程序输出的结果与推算的不一致,但差别不大。
①看看有没有把初值赋错。②看看有没有把“==”写成了“=”。
③看看有没有弄混“>”“<”“>=”“<=”
④变量类型对不对?输出类型对不对(如scanf(“%c”,(int)a);)?
三、熟练运用调试功能。
不一定要打开调试面板调试,输出中间变量也是一个很好的方法。通过对比一个(或多个)关键变量在程序中的变化与预期变化的差距,往往能发现问题。
4、AC(Accepted)
那你很棒棒哟!⊙v⊙嘛,以后还会更新的。
相关文章推荐
- STM32调试过程中常见的问题及解决方法
- net 下安装、调试的常见问题与错误及解决方法
- 微信小程序常见问题->上传文件后如何在后台(php)获取文件名解决方法
- win7 x64 下VC6的调试程序无法退出的问题解决方法
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (-)启动创建好的DBExpress工程时候报错了!
- 开发托管ActiveX或第三方程序托管插件时调试问题解决方法
- javaweb 常见问题-第2篇- chrom google 浏览器 调试时js无法刷新的解决方法
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
- C#Windows服务程序安装常见问题解决方法
- JS 调试中常见的报错问题解决方法
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
- 近几天 用微芯力科的板子 调试usb虚拟串口的程序,发现一些问题以及解决方法。和大家共享
- 微信小程序常见问题->上传文件后如何在后台(php)获取文件名解决方法
- 嵌入式项目开发调试流程,常见问题,解决方法
- ShellCode的调试方法和常见问题的解决方法
- 调试asp.net程序遇见的三个常见问题及其解决办法
- ShellCode的调试方法和常见问题的解决方法
- Android项目配置调试常见问题解决方法
- 调试asp.net程序遇见的三个常见问题及其解决办法
- win8下火狐安装firebug调试程序后打开崩溃的问题解决方法