有感于发现了一个隐藏很久的错误--思维定势

        这两天在给一个毕业设计的改程序,与其说是给他改程序,倒不如说是给自己改,因为程序从头到尾都是自己写的(除了使用的jrtplib、opencv库和别人写好的socket类),程序就是实现一个远程的视频查看,播放控制,就是最简单的从客户端上发送命令查看视频服务器上的视频,使用了RTP视频传输,用的从codeproject上下载的一个封装的socket类来发送控制信息。说到底也不难,其实就是把这几块组合组合,整个程序也是从自己的毕业课题程序中摘出来的。

        自己的那个程序跑起来基本正常,偶尔出现崩溃,当时也找过原因,可惜没找到,因为也不是每次都崩掉,只是偶尔,所以也就没再管(现在要毕业了,更不会去管了,留给师弟们去解决去吧!)。现在要带了一个本科毕业设计,说实在的:就我们专业本科生的水平(偶是自动化,重点院校),如果不是自己喜欢编程,上课讲的那点东西,连个VC的工程都不会建立!所以也不指望他能自己做出来,正好现在也木大有事了,所以就给整整吧,好歹人家也叫声学长啊(还请吃了个饭大笑)。

        废话了一大堆,还是没有到主题!

        总之把自己的程序精简了一下不相关的统统删掉,四个通道也改成了一个通道,界面改变了一下,只剩一个简单的对话框,总之简单的有点寒酸了,相应的代码也进行了修改,单纯的视频传输是没问题的,可是调试控制信息的时候,从客户端到服务器发消息没问题,从服务器发送响应消息总是出现WSA_INVALID_PARAMETER,参数错误!调试了一下午也没找到什么问题~~~大哭。偶然,纯粹是偶然,突然意识到,出现崩溃的时候都是在调用一个函数,就是在对话框界面类中使用socket发送数据,其中函数的参数有一个是socket的引用,也就是带了&,然后就返回去找。。。

        终于发现问题了:在自己写的一个传输类中,也有好几个并列的处理接收消息的函数,都是采用socket引用传递参数,而且在cpp文件中都在一块,也就是当时是按顺序写的,其中有一个就是将自己获得的socket通过sendmessage发送到对话框界面上,结果问题就在这里,sendmessage的两个参数,一个用来传递socket的参数,使用的是(wparam)&socket,当时应该想的是直接传值的,由于函数临近的几个函数都是按引用传递也就是出现了很多个&,而且参数名也都一样,思维上就产生一种错觉了,鬼使神差的就加上了&,然后在对话框中接收消息时,解析的却不是按socket的指针,而是直接转换为了socket,结果就将原本的socket指针当做了socket使用,并在界面函数中使用来发送信息,所以每次一调用发送函数就出错。

        现在看来,错误其实很简单,但是却隐藏了很长时间,写那段程序大约是一年以前了,当时没怎么用传递过去的socket所以,大部分时间都是运行没问题,所以就没有细究,查错。现在给别人改程序的时候却意外发现了,仔细想想如果不是使用sendmessage的函数附近的几个临近的其他函数都是使用引用,而且参数名字也都一样的话,可能当时就不会出错了。

        一连出现的多个相同的东西,形成了一种先是视觉上然后转变为思维上的陷阱,最终只要情况稍微一遍,就会掉进去。

        值得好好思考!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值