Pregunta

Me estoy quedando CodeBlocks sobre el compilador MinGW en una máquina virtual XP. He escrito en un código simple, accesible en cl1p , que responde a la pregunta algoritmo de la dirección CodeChef (Bueno, sólo responde en parte, ya que todavía no he incluido la bucle para múltiples casos de prueba.

Sin embargo, mi problema es, que mientras se ejecuta en modo de depuración, se da la salida correcta de 5, para la entrada:

3
1 | 2 1 | 1 2 3

Sin embargo, cuando construyo y ejecutarlo, se le da al absurdo, enorme salida de 131.078, lo que parece ser basura para mí. No entiendo cómo diablos está sucediendo esto, pero estoy adivinando que tiene algo que ver con la asignación de memoria dinámica. ¿Cuál es el problema aquí, y cómo puedo solucionarlo? Incluso me pasé por el compilador en línea en BotSkool , y funcionó bien . Después de añadir el bucle de casos de prueba, el código incluso trabajó correctamente en 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;
}
¿Fue útil?

Solución

Por un lado, esto:

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

copia el puntero, no toda la matriz.

Otros consejos

Ejecutar el código a través de Valgrind en una máquina Linux y usted se sorprenderá de cómo muchos lugares su código está perdiendo memoria. Si usted está tomando el camino difícil de la gestión de su memoria, hacerlo bien y 'eliminar' toda la memoria recién asignado antes de asignar más. Si, por el contrario, prefiere el camino fácil, utilizar un std :: vector y olvidarse de la gestión de memoria.

En su bucle, que tiene esta línea

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

En la primera iteración del bucle principal, cuando currownum == 1, se entra en el bucle que contiene esta línea, como i se inicializa a 1. Pero en la primera iteración, prevrow tiene un solo elemento y esta línea intenta acceder prevrow[1]. En una versión de depuración, la memoria simplemente se inicializa a cero, pero en una versión normal, se obtiene un valor de basura que acaba de pasar a estar en la memoria, lo que lleva al resultado que se ve.

Casi siempre, cuando se obtiene los valores de basura en una construcción normal, pero todo está bien en una versión de depuración, se accede a una cierta memoria sin inicializar.

Además, el programa está perdiendo memoria como un loco. Por ejemplo, no es necesario asignar ningún resultado de new dentro del bucle de prevrow porque justo después de que cambie prevrow a punto a otro bloque de memoria asignada. Además, debe llamar delete para cualquier memoria que ya no se está utilizando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top