即使是bug,当时令人印象深刻的bug也是会被忘记的
趁着稍还有些印象记录下棒材匹配过程中碰到的一些问题
首先是对旧代码的阅读,由于其年代久远能够正常运行但是写得比较混乱因此阅读非常之枯燥困难,同时里面不同情况下有过多重复代码,主要表现在数据结构以及具体实现方法上有比较大的漏洞,因此将问题复杂化了。
但是算法的思想是袮久可靠的,因此根据大致的算法自己脑海有一些思路,再由师兄设计的数据结构,使用vector来存储不需要进行增删的信息,使用list来存储需要进行插入删除更新的总信息,从这里也算是意识到,数据结构不是用来学学了解知道就好,而是在实际应用中要体现其价值,比如这里,使用这样的数据结构就是有师兄的效率以及实际情况的考虑的。
其次是对算法的理解。在接收到任务后便开始埋头苦干,大致理解了思路并不等于抓住了猫。其实自己还有很多迷糊甚至错误的地方,但是自己没有重视,匆忙下手去编写代码,然后在过程中不断碰到问题,然后发觉自己的思路是错误的!这很致命,甚至是说前面的代码都需要废弃重写!后来通过一些书籍的介绍,体会到先跑起来还是先分析问题清楚的优劣。但实际上,即使是先跑起来然后再在过程中不断发现新的问题,也算是对问题的深入以及纠正,如果不能在需求阶段就把问题分析清楚(其实也很难)那么这种方法也是可行的,但是会走一些弯路,所以尽量把要做什么、在做什么、怎么做、对不对思考好还是比较有利的,但也不能拘泥不前。
再有就是程序勉强能跑后要多次测试,不仅仅是一种情况下可以使用,还需要各种情况,各种时长都要合格才行。
于是就又暴露出了很多问题,甚至程序直接当掉。
原来就是程序中有各种问题没有考虑全面,比如说:棒材匹配的交错、指针移动越界、指针移动错误、某些flag标志未设置或者清零等情况。当然其中用到了师兄写的提取自己生成数据在图上显示的函数,可以直观地对程序正确性进行观察,这也告诉自己在查找问题时候不要思维固话要懂得利用信息来方便地进行观察。
同时一个函数仅仅是参数范围不同,来执行多次,那么在进行匹配插入等操作时候就会有不同的结果,比如第一轮是不会出现交叉匹配,但是第二轮就有可能,那么允许其交错匹配还是不允许呢。。。
最后根据师兄理解将数据结构的优劣进行了分析才了解自己写得多差。自己在外层循环使用的是vector而内层循环使用的是list,这样内层循环的效率就很低,而只要改变一下思路,其实是可以将内外反置的,同时这样一来问题也简化了,把同性质的问题提取出来,函数情况复杂度就下降了,再将可提取代码独立成小函数,更甚。
在这种情况下,后续的操作便有一定修改:允许交错匹配,但是在匹配后进行排序,因此插入新节点时候都无需考虑前后,直接先再后面插入,最后一轮的排序就可以解决乱序问题。然后学到了list的sort方法可以自己设置排序规则,其实很简单自己写个函数就ok。
// 做排序
// pre:输入,前面的一个元素
// next:后面的一个元素
// 返回:(pre.pos.x < next.pos.x);
bool DoSort(BarNode& pre, BarNode& next)
{
return (pre.pos.x < next.pos.x);
}
// 根据barList从x坐标由低到高排序
// barlist:链表
void BarMatchFollower::BarListSort(BarList& barList)
{
barList.sort(DoSort);
}
说到bug,想起几个先前的。一个是AJAX使用制作留言页面时候,存储到了数据库里面一直是乱码,虽然知道是编码问题但是一直搞不懂,良久,在js里面的添加了编码才解决。
var url = "tAjax_deal.aspx?u_msg=" + encodeURI(textMsg) + "&u_nick=" + encodeURI(textNick) + "&u_title=" + encodeURI(textTitle);
另外一个是关于HTML当使用JS控制一些效果比若鼠标移动显示隐藏一些数据,总莫名其妙地显示混乱,也就是本来设置了几个td用来分栏显示数据但是在chrome下所有数据都集中到了第一个td里面。问enimo才晓得是要
function onMouseOverTr(msgID)
{
//解决在CHROME下display设置成inline block时候显示时都集中到了第一个td内!
//设置"display:"
document.getElementById(msgID).style.display ="";
}