Перезапись векторов C ++ - PullRequest
       8

Перезапись векторов C ++

0 голосов
/ 22 ноября 2011

Я пытался перезаписать значения в свой вектор:

  for (i = 0; i < 50; i++)
  {      
        LJ.clear();
        LJ.reserve(210);

        //Calculate Lennard-Jones potential of every pair
        for(itr = 0; itr < 210; itr++)
        {
            term1 = pow(r[itr], 12);
            term1 = 1/term1;
            term2 = pow(r[itr], 6);
            term2 = 2/term2;
            LJ.push_back(term1 - term2);
        }

        //Calculate the initial Energy in the system Ei
        Ei = accumulate(LJ.begin(), LJ.end(), 0.0);
        Ei = Ei/2;
        cout << Ei << endl;
    }

Однако, когда я дважды сталкивался с циклом, емкость вектора получала некоторое значение мусора, и когда я пытался вставить элемент вЯ получил ошибку сегментации ... и если я оставил нашу резервную часть, я все еще получил ошибку сегмента

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Однако, когда я дважды сталкивался с циклом, емкость вектора получала какое-то мусорное значение [...]

Это явный признак повреждения памяти.*

Возможно, у вас есть массив в стеке, и вы перезаписываете стек, превышая предел массива, "наступая" на пальцы вектора.Какой бы массив ни находился ближе к объявлению LJ, это вероятная цель неудачной записи.

1 голос
/ 22 ноября 2011

Если r тоже std::vector, попробуйте изменить внутренний цикл следующим образом:

// assuming r is a vector<double>
for(vector<double>::iterator it = r.begin(), ite = r.end(); it != ite; ++it){
  // use *it instead of r[itr];
  term1 = pow(*it, 12);
  term1 = 1/term1;
  term2 = pow(*it, 6);
  term2 = 2/term2;
  LJ.push_back(term1 - term2);
}

Однако, если r является статически распределенным массивом (т. Е. В стеке), замените его следующим образом:

for(int itr = 0; itr < sizeof(r)/sizeof(r[0]); ++itr){
  // same content...
}

Если это не является ошибкой сегмента, r is not имеет 210 элементов.

...