2012-06-04 7 views
1

Привет, я программист-любитель, и, чтобы усугубить это, прошло какое-то время с тех пор, как я сделал какое-либо программирование, поэтому решил обновить свою память с помощью некоторых проблем с Topcoder. Первый, который я сделал, оказался сегментным недостатком, и сейчас я не могу понять, что я могу понять сам, может ли кто-нибудь помочь мне понять, откуда возникла ошибка сегмента. Вот код.Где ошибка сегментации в этом коде?

vector<int> Bonuses (vector<int> points) 
{ 
    int totalPoints = 0; 
    for (int i = 0; i != points.size(); ++i) 
    { 
     totalPoints += points[i]; 
    } 

    vector<int> percentage; 
    int percentageLeft = 100; 
    int truncatedPercentage; 

    for (int i = 0; i != points.size(); ++i) 
    { 
     truncatedPercentage = points[i]/totalPoints; 
     percentage.push_back(truncatedPercentage); 
     percentageLeft -= truncatedPercentage; 
    } 
    for (int i = 1;i <= percentageLeft; ++i) 
    { 
     percentage[percentage.size() - i] += 1; 
    } 
    return percentage; 


} 
+0

Вы нарушаете доступ к памяти, может выходить за пределы массива. – obo

+1

Вы должны научиться использовать отладчик [GDB] (http://www.gnu.org/software/gdb/documentation/). При сбое, как и эта ошибка сегментации, отладчик поможет вам определить местоположение аварии, а также позволить вам просматривать переменные, чтобы помочь вам понять причину сбоя. –

ответ

4

У вас есть логическая ошибка в вашей программе. Изменить это:

truncatedPercentage = points[i]/totalPoints; 

к этому:

truncatedPercentage = points[i] * 100/totalPoints; 

В противном случае процент будет практически всегда 0, а percentageLeft будет 100. Поэтому percentage[percentage.size() - i] += 1 будет segfaulting, как AndersK уже нашли раньше меня. Индекс обычно отрицательный.

Это говорит о том, что я не уверен в том, что смешение pushbacks и прямых назначений дает вам наиболее читаемый код, который вы могли бы здесь.

3

Вероятно, здесь

for (int i = 1;i <= percentageLeft; ++i) 
{ 
    percentage[percentage.size() - i] += 1; 
} 

Если percentageLeft больше, чем размер вектора. Если i превышает размер вектора, чем вы читаете перед его памятью, что приводит к нарушению доступа (segfault).

1
percentage[percentage.size() - i] += 1; 

std::map служили бы ваши цели лучше, чем std::vector для «процент».