国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

第一次移植出現(xiàn)的問題小結(jié)

2019-11-11 06:24:02
字體:
供稿:網(wǎng)友

    在快放假的前兩三個星期,移植公司一個大神負責的項目的代碼,我第一次接觸這種一個函數(shù)就有一千多行的代碼,有點大開眼界啊同時忙到飛起!大神就是不一樣!他本來在windows下寫的是C風格的,然后我先將這些直接放在一個類里測試了一遍,然后將其轉(zhuǎn)成C++風格的,最后再在linux上調(diào)試測試對比。

    這次的移植讓我明白了一個問題,原來移植不只是復(fù)制粘貼,那么就不叫做移植了。然后就是找問題找bug是一個漫長的調(diào)試過程,還有就是有時候通過調(diào)試知道了是在某一行出現(xiàn)了問題,但真正導(dǎo)致出問題的不是這一行,或者不是這一行附近的一些行,因為這些行邏輯和語法上都沒有任何問題。真正的問題出現(xiàn)在之前不報錯的某一行或者某些行中,經(jīng)過一定時間導(dǎo)致了內(nèi)存泄漏,感覺內(nèi)存泄露真的是個不好找的問題。

    我出現(xiàn)的一些問題,總結(jié)如下,怕以后自己忘記:

1、vector.clear()之后導(dǎo)致的下標超出問題(特別是在循環(huán)判斷中)

        比如在一個vector的循環(huán)中有一個判斷,滿足這個判斷就clear這個容器,那么下一次再循環(huán)時,容器里面什么都沒有,所以不能訪問容器某個位置的元素了,這樣會報下標超出的錯。

2、vector.erase()導(dǎo)致的迭代器失效問題

        erase語句會返回一個迭代器,比如現(xiàn)在對第三個位置的元素進行erase,那么內(nèi)部是第四個位置的元素自動填補上來,會移到第三個位置處,所以返回的仍然是第三個位置處的迭代器,但這個迭代器指的元素已經(jīng)是下一個元素了而已。

       我本來是這樣子修改的:

for(vector<int>::iterator it=vec.begin();it!=vec.end();it++){   if(*it==0){      it=vec.erase(it);      if(it==vec.end())         break;      else         continue;   }   ......}      這樣子沒有語法錯誤,但它漏掉了元素,因為erase返回的本來就是下一個元素了,還進行it++就是下下個元素了,所以漏掉了一些元素,沒有達到遍歷所有元素的效果。后來我修改成新定義一個迭代器:vector<int>::iterator iter=vec.erase(it);然后不用這個迭代器,當然it++也會跳過 但我后面想辦法不讓它跳過,總之也搞定了。但這樣子老板不放心。

最后老板說將所有滿足if的需要刪掉的元素的位置用一個數(shù)組保存起來,在循環(huán)結(jié)束后,對vector里的每個元素進行遍歷,如果這個元素的下標不是之前的數(shù)組里的,那么就保存這個元素到另一個新容器中,否則不保存這個元素,對下一個元素下標進行判斷。老板說這樣最安全。3、memset不能給類清零,最好只給數(shù)組或結(jié)構(gòu)體清零

      本來是一個包含string和int的結(jié)構(gòu)體,結(jié)果我用memset對這個結(jié)構(gòu)體進行清零,后來報錯了。原來不能對類、包含類的數(shù)組或結(jié)構(gòu)體進行清零。因為類有自己的一套方式。

4、linux函數(shù)聲明和定義時的默認實參與windows上的有點不一樣

     如果我沒記錯,windows上函數(shù)聲明和定義時都可以寫上默認實參的值,但linux上卻是在聲明時寫了默認實參的值在定義時就不能寫了。

5、windows轉(zhuǎn)成linux時同樣的代碼不能跑是格式問題

     在windows和linux之間進行轉(zhuǎn)換,好像有格式問題,自動的。可以用記事本查看格式被轉(zhuǎn)成了什么格式,轉(zhuǎn)到適合各自系統(tǒng)的再保存一遍就可以了。

6、windows下sort()函數(shù)自定義比較規(guī)則時

     sort( ,,)如果第三個參數(shù)是個返回bool型的函數(shù)f(),如果這個函數(shù)是個全局的函數(shù),那么直接用它的名字做第三個參數(shù)就是了,就代表指向函數(shù)地址的指針;如果這個函數(shù)是某個類的成員函數(shù),那么一定要加類作用域限定符,不然找不到的。

//sort(AlgaePRiority.begin(), AlgaePriority.end(), &EcologyMath::SortForVectorByPriority|);//windows:類名::函數(shù)名

7、linux和windows下使用三個實參的sort()函數(shù)調(diào)用形式不一樣的問題

      windows下調(diào)用三個參數(shù)的sort()函數(shù)就是第三個參數(shù)直接用函數(shù)名即可;但linux下不是 :

sort(AlgaePriority.begin(), AlgaePriority.end(), bind(&EcologyMath::SortForVectorByPriority,this,_1,_2));//linux	//sort(AlgaePriority.begin(), AlgaePriority.end(), &EcologyMath::SortForVectorByPriority|);//windows

8、又犯了個傻問題 聲明幾個同類型指針時我竟然并排聲明

      iplImage*  img1;

      IplImage*  img2;

     應(yīng)該這樣才對嘛。

9、Alt加左箭頭表明回退  Ctrl加Z也表示回退 但兩種回退有點不同  Ctrl加/表明注釋  cvSobel()在轉(zhuǎn)化為Sobel()時的問題還要加句

 convertScaleAbs

10、還有別的我寫的傻問題 比如new了沒delete啊 boundingRect函數(shù)的問題 while里我本來還寫了個死循環(huán)  還有C風格的尋找凸包和凹陷檢測時最遠點轉(zhuǎn)化為C++風格時的問題。

11、opencv3.1和opencv3.2加載SVM分類器的函數(shù)放的位置不一樣了

//opencv3.1	Ptr<ml::SVM> fusizao_svm;	fusizao_svm = ml::SVM::create();	fusizao_svm = ml::SVM::load<ml::SVM>("fusizao_svm.xml");//opencv3.2	Ptr<cv::ml::SVM> fusizao_svm;	fusizao_svm = ml::SVM::create();	fusizao_svm = Algorithm::load<cv::ml::SVM>("fusizao_svm.xml");


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌苏市| 珠海市| 密山市| 马龙县| 班戈县| 桦甸市| 漠河县| 旌德县| 高要市| 边坝县| 凤翔县| 湟源县| 额济纳旗| 大足县| 城步| 平安县| 金乡县| 庆城县| 泸水县| 奉新县| 太康县| 交城县| 日土县| 大港区| 瑞昌市| 钟山县| 玛纳斯县| 呼伦贝尔市| 衡南县| 定西市| 深泽县| 白城市| 广平县| 六枝特区| 永善县| 舞阳县| 宜丰县| 宿松县| 那坡县| 项城市| 即墨市|