今天修改一個點集,是一個Vector類型的變量,point。變量的每一條記錄是一個自定義類coo,也很簡單,只有x,y兩個屬性,都是int型的。
要實現的功能很簡單,就是把point里的每個x計算一下,x=x*r1/r2。因為在point里邊是不能直接進行運算的,所以要把相應的值讀出來,運算,再插進去——這就是我開始的思路。后來行不通,改成又新建了一個Vector變量,運算完后,查到這個變量后邊,然后在進行一個復制操作。
更改前的代碼(大致的):
1 coo one=new coo();
2 for(int i=0;i<point.size();i++){
3 one=point.get(i);
4 one.x=one.x*r1/r2;
5 point.remove(i);
6 point.add(i,one);
7 }
這段代碼的錯誤很多,簡單分析一下。
one 并沒有分配內存,所以3行獲得的只是一個地址,4行操作的也只是把地址為i的內容操作了;
5行邏輯也是錯誤的,因為地址i的數據就是計算后的,把正確的刪掉了又把第i行(就是刪除前的第i+1行),插了進去,弄來弄去,全亂套了。
下面是正確的代碼正確的代碼:
for (int i = 0; i < pointV.size(); i++) {
??? point_hold = new coordinate();
??? point_hold.x = ((coordinate) pointV.get(i)).x;
??? point_hold.y = ((coordinate) pointV.get(i)).y;
??? point_hold.x = point_hold.x * Reflectance_hold
????? / Reflectance;
??? pointH.add(point_hold);???
?? }
??
?? pointV.clear();
?? pointV=(Vector)pointH.clone();
?? pointH.clear();
其實這段代碼用的是最笨的辦法,不多說了,以后多注意。