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;


}
4

3 に答える 3

4

プログラムに論理エラーがあります。これを変える:

truncatedPercentage = points[i]/totalPoints;

これに:

truncatedPercentage = points[i] * 100 / totalPoints;

それ以外の場合、パーセンテージはほとんど常に0になり、percentageLeft100になります。これが、percentage[percentage.size() - i] += 1AndersKが私の前ですでに見つけたようにsegfaultingである理由です。通常、インデックスは負です。

とはいえ、プッシュバックと直接割り当てを組み合わせると、ここで使用できる最も読みやすいコードが得られるかどうかはわかりません。

于 2012-06-04T06:51:41.987 に答える
3

おそらくここ

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

percentageLeftベクトルのサイズよりも大きい場合。iベクトルのサイズを超える場合は、メモリ位置の前に読み取っていたため、アクセス違反(segfault)が発生します。

于 2012-06-04T05:55:17.107 に答える
1
percentage[percentage.size() - i] += 1;

std::mapstd::vector「パーセンテージ」よりもあなたの目的をよりよく果たしていただろう。

于 2012-06-04T06:08:37.377 に答える