2016-01-21 82 views
0
void GenerateNativeGamma(vector<float>& gammaNative, 
          float dDetX, 
          float sdd, 
          float moduleGapX, 
          int nModule, 
          int nChanDetX) 
{ 
    float L = 7*dDetX + (0.78/2+0.11/2); 

    gammaNative.push_back(0); 

    for (float n = 6.5; n>=-6.5; n--) 
    { 
     gammaNative.push_back(atanf(L/sdd)-atanf(n*dDetX/sdd)); 
    } 

    gammaNative.push_back(2*atanf(L/sdd)); 

    if(!gammaNative.empty()) 
    { 
      float lastBonM = gammaNative.back(); // ERROR HAPPENS HERE!!! 
      gammaNative.push_back(lastBonM +2*atanf(moduleGapX/2/sdd) ); 
    } 

    ...... 

} 

int main() 
{ 
     vector<float> gammaNative; 
     GenerateNativeGamma(gammaNative, 1.02, 869.5, 2.087,47, 24); 

} 

我正在通過引用將一個向量傳入main();目的是修改它裏面的矢量。vector.back()拋出「偏移量超出範圍」錯誤

然後我就這樣「偏移超出範圍」的錯誤時,試圖讓最後一個元素via vector.back()像下面的圖片顯示:

enter image description here

的載體沒有空的,所以它應該有一個back()。那麼我不知道這裏有什麼問題?或者這不是正確的方法,那麼我應該如何修改另一個函數內的矢量(動態)?非常感謝。

+0

我能想到的兩個原因是:空載體或內存損壞。 –

+0

試着用'float lastBonM = gammaNative.empty()替換錯誤的行? 0.0f:gammaNative.back();' 這個錯誤是否仍然發生呢? –

+0

@VioletGiraffe我認爲矢量不是空的東西。至少我看到裏面有15個元素。如果它是空的,它不會擊中使程序崩潰的線。我把空的()檢查放在那裏。 –

回答

2

請注意,調整矢量大小可能會導致底層數組被移動,從而使所有指針,引用和迭代器無效。當你通過引用傳遞給vector的push_back時,它可以被調整大小,當然,這個引用將會失效。

一個快速解決方法是在調用函數之前在向量上使用保留,以確保足夠的元素可以在不重新分配的情況下被壓入。

更好的解決方案可能是返回一份副本。

編輯:一個簡單的例子

vector<float> vec; 
vec.reserve(50); 
funcThatAdds50Floats(vec); 
+0

謝謝。聽起來很合理。有什麼機會可以發佈一些示例代碼?有幾行會有幫助。 –

+0

當然,在這裏你走了。 – Andrej

+2

我明白了。非常感謝............. –