2010-01-01 3 views
1

Je cours 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 inclus la boucle pour plusieurs cas de test.Différentes sorties après le débogage et la compilation de programmes C++

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

Cependant, quand je générer et exécuter, il donne l'absurde, énorme sortie 131078, ce que voient ms comme des ordures à moi. Je ne comprends pas comment cela se passe, mais je suppose que c'est quelque chose à voir avec l'allocation de mémoire dynamique. Quel est le problème ici, et comment puis-je le réparer? Je l'ai même passé à travers le compilateur en ligne au BotSkool, et ça a bien fonctionné. Après avoir ajouté la boucle pour les cas de test, le code a même fonctionné 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; 
} 
+0

Vous devez publier le code réel et non des liens vers celui-ci. –

Répondre

1

D'une part, ceci:

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

copie le pointeur, pas tout le tableau.

+0

êtes-vous sûr? Je voulais un moyen de copier toutes les valeurs de currow dans le passé. Comment je fais ça? – Neil

+0

Un moyen serait memcpy: memcpy (prevrow, currow, sizeof (int) * i); –

1

Exécutez le code via Valgrind sur une machine Linux et vous serez surpris du nombre d'endroits où votre code a des fuites de mémoire. Si vous prenez la route difficile de gérer votre mémoire, faites-le bien et «supprimez» toute la nouvelle mémoire allouée avant d'en allouer plus. Si, d'un autre côté, vous préférez la route facile, utilisez un std :: vector et oubliez la gestion de la mémoire.

+0

Wow. Je n'étais pas du tout conscient des vecteurs, et je me sens assez stupide, car il est apparu dans une recherche d'équivalents C++ à ArrayList en Java. De toute façon, merci, cette connaissance m'aidera grandement. Tout site vous recommande d'apprendre toutes les autres structures de données en C++? En outre, le site Valgrind ne fournit pas de binaires. Tout endroit où vous savez que je peux obtenir des binaires pour Mac OS X? J'ai une ancienne version incompatible de XCode installée sur mon Mac en ce moment, et je ne veux pas expérimenter avec la construction d'applications en ce moment (pas si bon avec la ligne de commande Unix) – Neil

+0

Inclure http://www.cplusplus.com/reference/ et http://www.cppreference.com/wiki/start dans vos signets pour un starter :) Vous y trouverez les structures de données et les algorithmes fournis dans la bibliothèque standard C++. Les tutoriels à leur sujet abondent. Google! –

+0

Valgrind n'est pas encore fourni sous forme binaire pour Mac OS X, mais vous avez des substituts dans Mac OS X. XCode fournit plusieurs outils gratuits, comme Instruments et MallocDebug. –

1

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]. Dans une construction de débogage, la mémoire est simplement initialisée à zéro, mais dans une construction normale, vous obtenez une valeur de poubelle qui vient juste d'être dans la mémoire, menant au résultat que vous voyez. Pratiquement toujours, lorsque vous obtenez des valeurs de vidange dans une construction normale, mais que tout va bien dans une construction de débogage, vous accédez à de la mémoire non initialisée.

En outre, votre programme fuit la mémoire comme un fou. Par exemple, vous n'avez pas besoin d'affecter un résultat de new à l'intérieur de la boucle à prevrow car, juste après, vous changez prevrow pour pointer vers un autre bloc de mémoire allouée. En outre, vous devez appeler delete pour toute mémoire que vous n'utilisez plus.

Questions connexes