2013-04-11 100 views
-1

我在存儲Point數據類型元素[x,y]的向量上進行迭代,並且我想在每次迭代中實現的是添加第一個4點x元素和前4個點y元素....在下一次迭代期間,我希望與下一個4 x & y ......相同,等等迭代遍歷一個向量時的運行時錯誤

第1次迭代1.x + 2.x + 3.x + 4.x 1.y + 2.y + 3.y + 4.y

第2次迭代5.x + 6.x + 7.x + 8.x 5.y + 6.y + 7.y + 8.y

等.... .................希望我的問題是清楚的

示例代碼:

double Pta; 
    double Ptb; 
    Point vect; 
    float R1, R2; 
    float resultant; 
    vector<Point> vect_add; 
    for(vector<Point>::iterator iter_a = Left_Arm_xy.begin()+1; iter_a != Left_Arm_xy.end(); ++iter_a) 
    { 

     if(center.y <= 240) 
     { 
      vect.x = iter_a->x - (iter_a -1)->x; 
      vect.y = iter_a->y - (iter_a -1)->y; 

      vect_add.push_back(Point(vect.x,vect.y)); 


      for(vector<Point>::iterator iter_v = vect_add.begin(); iter_v != vect_add.end(); ++iter_v) 
      { 



        R1 = iter_v->x + (iter_v +1)->x + (iter_v +2)->x + (iter_v +3)->x; 
        R2 = iter_v->y + (iter_v +1)->y + (iter_v +2)->y + (iter_v +3)->y; 

        resultant = sqrt(pow(R1,2) + pow(R2,2)); 



        cout<<"Resultant: "" "<<resultant<<endl; 

      } 

     } 

當我彗星在哪裏我想添加的所有部分x的和y的程序工作正常,就像以前一樣.....因此,問題必須在那裏..我猜語法不對,但我不是最好的程序員,不能這樣做什麼錯,因爲沒有編譯器警告....程序崩潰只是在運行時

誰能可能看到我在做什麼毛病此代碼 問候

調試: enter image description here

對不起,只是增加調試斷點的照片,但我認爲圖片是值得1000個字在這種情況下:P

+0

你懷疑'vect_add.size()> 4'是什麼意思? – 2013-04-11 03:52:23

+0

如果此矢量內有超過4個元素,則在此if語句中繼續並執行代碼 – Tomazi 2013-04-11 03:54:10

+0

您是對的。所以如果'vect_add.size()'是3,那麼這個代碼永遠不會運行。如果'vect_add.size()'是5,它將運行5次。這與您對該計劃的描述不符。 – 2013-04-11 04:00:15

回答

1

向量可以通過控制你的迭代器+ 3是否超過你矢量(vect_add)的限制做到這一點,這樣你就不會超過載體界限,也爲每個迭代你必須以4比增加迭代器來獲得您的設計方案:

for(vector<Point>::iterator iter_v = vect_add.begin(); iter_v - vect_add.begin() + 4 < vect_add.size(); iter_v+=4) 
{ 
     R1 = iter_v->x + (iter_v +1)->x + (iter_v +2)->x + (iter_v +3)->x; 
     R2 = iter_v->y + (iter_v +1)->y + (iter_v +2)->y + (iter_v +3)->y; 

     resultant = sqrt(pow(R1,2) + pow(R2,2)); 



     cout<<"Resultant: "" "<<resultant<<endl; 

} 

這裏,iter_v - vect_add.begin()給當前迭代器的索引,並在for循環中,我們檢查是否存在的Elemen足夠數量的你的加法操作。

+0

嘿你你的男人:)非常感謝你沒有任何一點我接近這個解決方案。問候 – Tomazi 2013-04-11 05:14:08

0

其中的一個問題是在這裏:

R1 = iter_v->x + (iter_v +1)->x + (iter_v +2)->x + (iter_v +3)->x; 
R2 = iter_v->y + (iter_v +1)->y + (iter_v +2)->y + (iter_v +3)->y; 

iter_v + 1iter_v+ 3可能超出範圍,導致嘗試訪問不屬於vector的內存,因此崩潰。

檢查條件if(vect_add.size() >4)在這種情況下沒有多大幫助。

這一塊沒有任何意義可言:

if(vect_add.size() > 20) 
{ 
    vect_add.clear(); //does not make sense, you remove all the elements in vector? 
} 
+0

感謝您的回覆....你我雖然這將是問題這就是爲什麼我添加這個條件'如果(vect_add.size()> 4)'所以我怎麼能重新排列這個變化,以便我可以實現什麼後......? – Tomazi 2013-04-11 03:56:12

+0

@Tomazi你可以改變你的矢量迭代條件爲:iter_v +3!= vect_add.end()。這種檢查在這種情況下根本沒有用。 – taocp 2013-04-11 03:57:42

+0

好吧我刪除了檢查並厭倦了你的建議bu增加我的iter_v + 3每次迭代和效果是一樣的。 – Tomazi 2013-04-11 04:18:50

0

不知道這是相關的,但結算矢量無效迭代器。來自std::vector clear

所有與此容器相關的迭代器,指針和引用都是無效的。

您清除這裏

if(vect_add.size() > 20) 
{ 
    vect_add.clear(); 
} 
+0

是的,你是對的,爲什麼我有這個如果聲明的原因是因爲我想嘗試一些東西:P,並忘記刪除這部分,而創建此帖子... – Tomazi 2013-04-11 04:17:33