2012-06-04 73 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被作爲段錯誤我AndersK之前就已經發現了。該指數通常爲負值。

這就是說,我不確定混合推送和直接分配是否爲您提供了可讀性最高的代碼。

3

這裏大概

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

如果percentageLeft比向量的大小。如果i超過矢量的大小,則比您在存儲位置之前正在讀取的內容會導致訪問衝突(段錯誤)。

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

std::map會服你的目的優於std::vector爲「百分比」。