2014-01-25 4 views
1

В приведенном ниже коде я пытаюсь отображать ежедневный отчет с общей продажей. Выход правильный, но выход с ошибкой сегментации. Как я могу решить эту проблему?C++ Ошибка сегментации с вектором

Выход

Date  Total Sales 
03Nov13  745 
13Jan14  538 
Segmentation fault (core dumped) 

Код:

for (int index=0;index<stockVector.size();index++) 
    {     
      if (stockVector[index].getTransDate() == stockVector[index+1].getTransDate()) 
      { 
       int totalSum = ((stockVector[index].getQtyPurchase() * stockVector[index].getUnitPrice()) + 
         (stockVector[index+1].getQtyPurchase() * stockVector[index+1].getUnitPrice()));     
       cout << stockVector[index].getTransDate() << "\t\t" << totalSum << endl; 
      } 
     } 

Это мои данные в текстовый файл, который был сохранен в векторе.

ProductID:Description:Price:Qty:Transaction Date 

003:Calendar:5:104:03Nov13 
079:Revlon Foundation:5:45:03Nov13 
005:MacBook Pro:3500:1:10Jan14 
010:NesCafe Latte:1:9:1Jan14 
095:Lipton Tea:5:95:13Jan14 
096:Milk Tea:3:21:13Jan14 
066:Samsung Note 3:450:1:23Jan14 
088:HP Mouse:23:100:24Jan14 

ответ

4

В вашем цикле вы используете индекс (index+1 в состоянии), которые могут ссылаться на элемент после последнего элемента вектора (когда index достигает stockVector.size() - 1). Выделение указателя (которое вызывается stockVector, когда его operator[]) в месте, расположенном за пределами конца массива, является неопределенным поведением, поэтому может случиться что угодно (включая получение правильного результата и затем сбой).

Чтобы решить эту проблему, просто зажать петлю на stockVector.size() - 1:

for (int index=0;index<stockVector.size() - 1;index++) 
{ 
    // ... 

Вы можете однако должны оценить, является ли это решение является достаточным для последнего элемента вашего вектора.

+0

запасVector [индекс + 1] в последней итерации цикла – scraatz

3
stockVector[index+1] 

Это, очевидно, пройти мимо конца вектора, когда index достигает size() - 1.

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

Смежные вопросы