質問

私はXP仮想マシンでのMinGWコンパイラのコードブロックを実行していますよ。私は、いくつかの簡単なコードで cl1p に、 CodeChef を(私はまだ含まれていないだけでなく、それだけで、一部はそれに答えます複数のテストケースのためのループ

しかし、私の問題は、デバッグモードでそれを実行している間、それは入力のために、5の正しい出力を与えること、ですます:

3
1
2 1
1 2 3

しかし、私が構築し、それを実行すると、それは私にはゴミのように思える何の不条理、巨大な出力131078、提供します。私はこの地獄が起こっているが、動的なメモリ割り当てを行うには、それの何かを推測していますどのように理解していません。何ここでの問題だし、どのように私はそれを修正することができますか?私も BotSkool をオンラインでコンパイラを通してそれを走った、そしてそれは罰金を働きました。テストケースのためのループを追加した後、コードがさえCodeChefで正常に働いていた!

#include <iostream>

using namespace std;

int main()
{
    // Take In number of rows
    int numofrows;
    cin >> numofrows;

    // Input Only item in first row
    int * prevrow;
    prevrow = new int[1];
    cin >> prevrow[0];

    // For every other row
    for (int currownum = 1; currownum < numofrows; currownum++)
    {
        // Declare an array for that row's max values
        int * currow;
        currow = new int[currownum+1];

        int curnum;
        cin >> curnum;

        // If its the first element, max is prevmax + current input
        currow[0] = prevrow[0] + curnum;

        // for every element
        int i = 1;
        for (; i <= currownum; i++)
        {
            cin >> curnum;

            // if its not the first element, check whether prevmax or prev-1max is greater. Add to current input
            int max = (prevrow[i] > prevrow[i-1]) ? prevrow[i] : prevrow[i-1];

            // save as currmax.
            currow[i] = max + curnum;
        }

        // save entire array in prev
        prevrow = new int[i+1];
        prevrow = currow;
    }

    // get highest element of array
    int ans = 0;
    for (int j=0; j<numofrows; j++)
    {
        if (prevrow[j] > ans)
        {
            ans = prevrow[j];
        }
    }

    cout << ans;
}
役に立ちましたか?

解決

一つのことについては、これます:

    //save entire array in prev
    prevrow = new int [i+1];
    prevrow = currow;

のコピーポインタではなく、全体のアレイ。

他のヒント

Linuxマシン上のValgrindてコードを実行すると、あなたはあなたのコードがメモリをリークしているどのように多くの場所で驚かれることでしょう。 あなたがあなたの記憶を管理するの険しい道を取っている場合は、より割り当てる前に、すべての新しい割り当てられたメモリを、それをうまくやると「削除」。 一方、あなたは簡単に道を好む場合は、STD ::ベクトルを使用してメモリ管理を忘れます。

あなたのループでは、この行を持っている。

int max = (prevrow[i]>prevrow[i-1])?prevrow[i]:prevrow[i-1];
currownum == 1iに初期化されるよう1、このラインを含むループは、入力されるメインループの最初の反復で

。しかし、最初の反復で、prevrowは一つだけの要素を持っており、このラインは、アクセスprevrow[1]にしようとします。デバッグビルドでは、メモリは単純にゼロに初期化されるが、通常のビルドでは、あなただけのあなたが見る結果につながる、メモリ内にあることを起こっていること、いくつかのゴミ値を取得します。

ほとんど常に、あなたが通常のビルドでゴミ値を取得するときに、しかし、すべてはあなたには、いくつかの初期化されていないメモリにアクセスしている、デバッグビルドで結構です。

また、あなたのプログラムは狂ったようにメモリをリークしています。たとえば、あなたは右の後にあなたが割り当てられたメモリの別のブロックにポイントにnewを変更することをのでprevrowにループ内prevrowのいずれかの結果を割り当てる必要はありません。また、あなたは、もはや使用していることを任意のメモリのためのdeleteを呼び出す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top