Frage

Ich bin Codeblocks auf dem MingW Compiler in einer XP virtuellen Maschine ausgeführt wird. Ich schrieb in einigen einfachen Code, erreichbar unter cl1p , die den Algorithmus Frage auf CodeChef (Nun, es es nur teilweise beantwortet, da ich noch nicht das enthalten Schleife für mehrere Testfälle.

Allerdings, mein Problem ist, dass, während es im Debug-Modus ausgeführt wird, gibt es die korrekte Ausgabe von 5, für die Eingabe:

3
1 | 2 1 | 1 2 3

Allerdings, wenn ich bauen und führen Sie es, gibt es das absurde, das riesige Ausgabe 131.078, was für mich wie Müll scheint. Ich verstehe nicht, wie zum Teufel dies geschieht, aber es ist etwas zu tun mit der dynamischen Speicherzuweisung ist zu raten. Was ist das Problem hier, und wie kann ich es beheben? Ich lief es auch über die Online-Compiler unter BotSkool , und es funktionierte gut . Nach dem Hinzufügen der Schleife für Testfälle, arbeitete der Code auch korrekt auf 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;
}
War es hilfreich?

Lösung

Für eine Sache, diese:

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

kopiert den Zeiger, nicht das gesamte Array.

Andere Tipps

Führen Sie den Code durch Valgrind auf einem Linux-Rechner und Sie werden staunen, wie viele Orte, um Ihre Codespeicher undicht. Wenn Sie den harten Weg nehmen, um Ihre Erinnerung an die Verwaltung, tun es auch und ‚Löschen‘ alle neu zugewiesenen Speicher vor mehr zugeordnet werden. Wenn auf der anderen Seite bevorzugen Sie den einfachen Weg, verwenden Sie einen std :: vector und vergessen Sie die Speicherverwaltung.

In der Schleife, haben Sie diese Zeile

int max = (prevrow[i]>prevrow[i-1])?prevrow[i]:prevrow[i-1];

bei der ersten Iteration der Hauptschleife, wenn currownum == 1, die Schleife dieser Zeile enthalten, wird eingegeben, wie i zu 1 initialisiert. Aber auf der ersten Iteration prevrow hat nur ein Element und diese Linie versucht, den Zugang prevrow[1]. In einem Debug-Build, wird der Speicher einfach auf Null gesetzt, sondern in einem normalen bauen, Sie einigen Müll Wert bekommen, dass gerade in dem Speicher sein passierte, was zu dem Ergebnis, die Sie sehen.

So ziemlich immer, wenn Sie Müll Werte in einem normalen Build erhalten, aber alles ist in Ordnung in einem Debug-Build, Sie werden einige nicht initialisierten Speicher zugreifen.

Auch Ihr Programm ist undicht Speicher wie verrückt. Zum Beispiel brauchen Sie kein Ergebnis von new innerhalb der Schleife zu prevrow weil direkt nach zuweisen, dass Sie prevrow zu Punkt zu einem anderen Block des zugeordneten Speichers ändern. Außerdem sollten Sie delete für jeden Speicher aufrufen, dass Sie nicht mehr verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top