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

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;
    }
    
    

根据代码和上面图片的信息,很容易判断错误在哪。

②缺失参数

比如这样:

void f(int a)
{
    ......
}
int main()
{
    f();
    return 0;
}
    
    

就会有这样的错误信息返回:

[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);
}
    
    

然后就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);
    }
   }
    
    

看不懂啊QAQ
不过没关系,我们知道错误行是这个:

if (*__i < *__first){···}

啥意思呢?想想sort是用来干什么的?排序,对吧。而我们的a是一个结构体,里面包含着c,v两个数。
于是就得出结论:程序不知道按什么来排序了。
怎么办呢?手写cmp函数。
如果想按c排序,就这样:

bool cmp(A a,A b)
{
    return a.c<b.c;
}
    
    

然后把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⊙

嘛,以后还会更新的。

发布了75 篇原创文章 · 获赞 80 · 访问量 2万+

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;
    }
  
  

根据代码和上面图片的信息,很容易判断错误在哪。

②缺失参数

比如这样:

void f(int a)
{
    ......
}
int main()
{
    f();
    return 0;
}
  
  

就会有这样的错误信息返回:

[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);
}
  
  

然后就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);
    }
   }
  
  

看不懂啊QAQ
不过没关系,我们知道错误行是这个:

if (*__i < *__first){···}

啥意思呢?想想sort是用来干什么的?排序,对吧。而我们的a是一个结构体,里面包含着c,v两个数。
于是就得出结论:程序不知道按什么来排序了。
怎么办呢?手写cmp函数。
如果想按c排序,就这样:

bool cmp(A a,A b)
{
    return a.c<b.c;
}
  
  

然后把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⊙

嘛,以后还会更新的。

猜你喜欢

转载自blog.csdn.net/qq_36693514/article/details/77905589