Question

Je suis en cours d'exécution CodeBlocks sur le compilateur MinGW dans une machine virtuelle XP. Je l'ai écrit dans un code simple, accessible à cl1p , qui répond à la question de l'algorithme CodeChef (Eh bien, il répond que cela en partie, comme je l'ai pas encore compris la boucle de cas de tests multiples.

Cependant, mon problème est que lors de l'exécution en mode debug, il donne la sortie correcte de 5, pour l'entrée:

3
1
2 1
1 2 3

Cependant, quand je construis et l'exécuter, il donne la sortie absurde, énorme 131078, ce qui semble être du charabia pour moi. Je ne comprends pas comment diable ce qui se passe, mais je devine qu'il est quelque chose à voir avec l'allocation dynamique de mémoire. Quel est le problème ici, et comment puis-je résoudre ce problème? Je l'ai même couru par le compilateur en ligne BotSkool , et il a bien fonctionné . Après avoir ajouté la boucle pour les cas de test, le code a même travaillé correctement sur 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;
}
Était-ce utile?

La solution

Pour une chose, ceci:

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

le pointeur, pas tout le tableau.

Autres conseils

Exécuter le code par Valgrind sur une machine Linux et vous serez étonné de voir combien d'endroits votre code est une fuite de mémoire. Si vous prenez la route difficile de gérer votre mémoire, faites-le bien et « supprimer » toute la mémoire nouvelle allouée avant d'allouer plus. Si, d'autre part, vous préférez la route facile, utiliser un std :: vecteur et oublier la gestion de la mémoire.

Dans votre boucle, vous avez cette ligne

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

Sur la première itération de la boucle principale, lorsque currownum == 1, la boucle contenant cette ligne sera entrée, comme i est initialisé à 1. Mais à la première itération, prevrow n'a qu'un seul élément et cette ligne tente d'accéder prevrow[1]. conduisant au résultat que vous voyez dans une version de débogage, la mémoire est simplement initialisé à zéro, mais dans une version normale, vous obtenez une valeur de déchets qui vient de se passer dans la mémoire,.

Quasiment toujours, quand vous obtenez des valeurs de déchets dans une version normale, mais tout va bien dans une version de débogage, vous accédez à une mémoire non initialisée.

En outre, votre programme est une fuite de mémoire comme un fou. Par exemple, vous ne devez attribuer aucun résultat de new dans la boucle à prevrow car juste après que vous changez prevrow pour pointer vers un autre bloc de mémoire allouée. En outre, vous devez appeler delete pour une mémoire que vous n'utilisez plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top