2016-01-21 49 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

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