C++编译问题汇总(调试技巧)

前几天写了一个核酸检测的程序,在编写过程中发现了反复在犯几种常见的错误,特此总结一下,以提高后期的纠错速度。

编译报错详解

本文使用的编译器是codeblocks

第一种——括号丢失

括号丢失这种情况,在你写小程序的时候,根本不能算是问题,但当代码的规模达到一定程度的时候,你就会有应接不暇的感觉了。

 Date(int a,int b,int c{year=a;month=b;day=c;}

希望能在大括号 { 前面有一个小括号

第二种——变量写错了

int gety(){return yea;}

前面定义的是year,后面打错成了yea

第三种——没有对应的函数原型

void operation::find_name(string string1)
{vector<message>::iterator u=person.begin();
     while(u!=person.end())
     {
         if((*u).getname()==string1)
         {  cout<<endl<<"根据姓名"<<string1<<"找到该成员:";
            cout<<"姓名:"<<(*u).getname()<<" "<<"身份证号:"<<(*u).getidnum()<<endl;
            cout<<"手机号:"<<(*u).getcall()<<" "<<"检测次数:"<<(*u).gettime()<<endl;
            cout<<"最近检测时间:"<<(*u).getrecent_time()<<" "<<"检测结果:"<<(*u).getoutcoming()<<endl;
            break;
         }
         else
            u++;
     }
}

 第四种——重载运算符格式出错

ostream&operato <<(ostream&output,message&s)
{
    output<<s.getname()<<" ";
    output<<s.getcall()<<" ";
    output<<s.getidnum()<<" ";
    output<<s.gettime()<<endl;
}

 <<前面没有initializer,也就是没有按照固定的格式进行编写。

第五种——函数调用不正确

void operation::change_message(string idnum1,int time1,string recent_time1,int outcoming1)
{  map<string,int>::iterator w=idmap.begin();
        while(w!=idmap.end())
        {if(idnum1==person[w->second].getidnum() )
            {person[idmap[idnum1]].set(time1);
             person[idmap[idnum1]].setrecent_time(recent_time1);
             person[idmap[idnum1]].setoutcoming(outcoming1);
             cout<<person[idmap[idnum1]].getname()<<"核酸检测信息已进行修改"<<endl<<"检测次数:"<<person[idmap[idnum1]].gettime()<<endl<<"最近检测日期:"<<person[idmap[idnum1]].getrecent_time()<<endl<<"检测结果:"<<person[idmap[idnum1]].getoutcoming();
             cout<<endl<<endl;
             break;
            }
         else if(idnum1!=person[w->second].getidnum()&&w!=idmap.end())
            {w++;}
         if(w==idmap.end())
            {cout<<"未找到该成员"<<endl;}
        }

}

       

 

前面没有set函数,应该写的是setime函数,这是一般会出现__gnu_cxx::_alloc等情况

第六种——漏写取地址运算符

void operation::find_surname(string a)
{

 vector<message>::iterator e=person.begin();
   while(1)
   {if(a==(e).getname().substr(0,2)&&e!=person.end())
        {cout<<"查找到一名姓"<<a<<"的同学:"<<(*e).getname()<<endl;e++;}
    else
        {e++;}
    if(e==person.end())
        break;
    }
    cout<<endl;
}

 

 

 此处仔细观察可以知道,第五行代码应该是a==(*e),但是没有加上*,导致没法取内容。

调试程序技巧

在编写程序的时候,特别是规模较为宏大的程序时,一定要注意写程序的技巧

分小功能编写“零件”,逐个击破

比如说,一个小型的工程项目,要实现很多功能,有生成名单,按各种信息进行查找,等等。

这时,切记不要一门子写完,然后再运行,否则你就会发现,一运行一堆错误,代码还是好几百甚至上千行,严重干扰你的纠错速度,你应该将该功能所需要的成员信息连同这个小的功能函数,重新新建一个文件进行编译,原来我不注意这一点,现在才发现这样做的重要性和高效性。最后,再讲许许多多的小的没有错误的模块拼接在一起,就可以立即组装成一个大的产品了。

在适当的位置添加cout语句

在适当的位置添加cout语句可以让你在短时间内定位该范围内是否出现了程序的运行错误。举个例子:

void operation::count_num(int a)
{vector<message>::iterator k=person.begin();
 int count=0;
 while(k!=person.end())
 {if((*k).gettime()==a)
    {count++;k++;}
  else
    k++;
 }

这是一个统计人数的函数,我们可以在函数体一开始的时候,添加语句“cout<<1;”

那么函数调用或是函数本身是否存在问题呢,程序运行完成后:

假如你发现没有数字1的输出,那么你就可以迅速定位,错误出现在该行或者是该行以前的位置。

假如你发现有数字1的输出,那么你可以断定该处没有错误,函数可以运行,错误应该存在于该行以后的位置。你应当在后面的代码中选取合适的位置添加cout<<1;比如上述例子,我就会在while语句中添加输出语句,进而判断循环是否出问题。

经过这样的往复判断,你就可以不停地将错误可能存在的范围缩小,最终定位到错误所在行,再结合前面的报错总结进行迅速纠错,如此一来就形成了一个完整的调试程序的闭环。

总结

具体纠错流程图

 

感想

调试程序是程序员的基本技能,“调”远远要比“写”困难得多!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛哥带你学代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值