Help!! Ca compile mais après ca "cesse de fonctionner"

Help!! Ca compile mais après ca "cesse de fonctionner" - C++ - Programmation

Marsh Posté le 10-12-2009 à 10:55:37    

C'est un programme pour additionner des nombres sous forme de tableaux. Donc on recrée l'addition... La création de tableaux ne pose pas de probèmes.
Ca bloque au niveau de la méthode add (pour addition).  
J'arrive pas à trouver le problème. Le programme compile mais après, quand j'exécute, ça me met: "...a cessé de fonctionner".
Je suis désespérée. Une âme charitable qui passerait là par hasard, aurait-elle la bonté de m'aider?!
 
#include<iostream>
using namespace std;
int* creation (void)
{
     int lg;
     cin >> lg;
     int* nbr = new int (lg+1);
     for (int i = 1; i < lg + 1; i++)
     {
        cin >> nbr[i];
     }
     nbr[0]= lg;
     return (nbr);
}
 
int afficher (int* nbr)
{
    for (int i = 1 ; i < nbr[0] +1 ; i++)
    {
        cout << nbr[i] ;
    }
    cout << endl;
    return 0;
}
 
bool tstegal (int* nbr1, int* nbr2)
{
     bool egaux = true;
     if (nbr1[0] =! nbr2[0])
     {
        return (false);
     }
     else
     {
         int i = 1;
         while ( (i < nbr1[0] +1) & egaux )
         {
               if ( nbr1[i] =! nbr2[i])
               {
                    egaux = false;
               }
               i = i +1;
         }
     }
     return (egaux);
}
 
int*add(int* x,int* y)//methode pour additionner des nombres sous forme de tableaux
{if(x[0]>y[0])
  {int* n=new int[x[0]];
    for(int i=x[0]-y[0];i<x[0]+1;i--)//on additionne les chiffres de x et y en décrémantant
      {n[0]=x[0]; n[i-1]=0;// le tableau (n) crée a la taille du plus grand des nombres (taleaux) qu'on additionnent (ici x)
        if(y[i]+x[x[0]-i]<=9)//addition dans le cas ou il n'y a pas de reste
           {n[i]=y[i]+x[x[0]-i];}
        else{n[i]=0;n[i-1]=n[i-1]+1;};//les manipulationns sur n[i-1] qu'on avait initialisé à 0 servent à eviter d'introduire un reste
      }
    for(int i=1;i<x[0]-y[0];i++)//pour les autres chiffres de n, on prend ceux de x
    {n[i]=x[i];};
return n;
  };
 if(y[0]>x[0])//les 2 autres boucles if font la même chose pour les cas restants
  {int*n=new int[x[0]];
    for(int i=y[0]-x[0];i<y[0]+1;i--)
      {n[0]=y[0]; n[i-1]=0;
        if(x[i]+y[y[0]-i]<=9)
           {n[i]=x[i]+y[y[0]-i];}
        else{n[i]=0;n[i-1]=n[i-1]+1;};
        }  
     for(int i=1;i<y[0]-x[0];i++)
    {n[i]=y[i];} ;    
return n;
   };
         
  if(x[0]=y[0])
  {int* n=new int[x[0]];
    for(int i=1;i<x[0]+1;i--)
      {n[0]=x[0]; n[i-1]=0;
        if(y[i]+x[x[0]-i]<=9)
           {n[i]=y[i]+x[x[0]-i];}
        else{n[i]=0;n[i-1]=n[i-1]+1;};  
      };
  return n;
  }      
}      
 
int main(void)
{int* x=creation(); afficher (x);int* y=creation(); afficher (y); int* z =add(x,y); afficher (z);}

Reply

Marsh Posté le 10-12-2009 à 10:55:37   

Reply

Marsh Posté le 10-12-2009 à 11:14:23    

utilise std::vector au lieu de tes * moches et tu y verras deja plus clair

Reply

Marsh Posté le 10-12-2009 à 11:26:17    

désolé mais comme je débute sur c++, ton "std::vector ", je sais même pas ce que c'est...
Ouai je connais pas encore bien

Reply

Marsh Posté le 10-12-2009 à 15:02:47    

Reply

Marsh Posté le 10-12-2009 à 15:53:08    

Ton bloc de code pour la fonction "add()" est à la limite du bitable, déjà, cette condition de ta boucle "for" me parait foireuse :

Code :
  1. for(int i=x[0]-y[0];i<x[0]+1;i--)//on additionne les chiffres de x et y en décrémantant
  2.       n[0]=x[0], n[i-1]=0;// le tableau (n) crée a la taille du plus grand des nombres (taleaux) qu'on additionnent (ici x)


 
À l'initialisation i est forcément inférieur à x[0], et comme tu décrémente, i ne deviendra jamais supérieur à x[0], d'où buffer underflow, d'où plantage.


Message édité par tpierron le 10-12-2009 à 15:53:27
Reply

Marsh Posté le 10-12-2009 à 20:36:59    

Déjà l'allocation tout au debut, pas bon...  

Code :
  1. int* nbr = new int (lg+1);


Ca fait pas se que tu pense...
 
# Et puis l'absence de desallocation a la fin :/
 
=> Bilan, tu gagneras du temps a apprendre a utiliser les vector


Message édité par Amonchakai le 10-12-2009 à 20:39:40
Reply

Marsh Posté le 10-12-2009 à 23:03:37    

non mais pour vos histoires de vectors, on nous impose d'utiliser des tableaux. Donc peut-être que j'ai mis des betises...mais je peux pas utiliser les vectors.
Au passage, je précise que le problème vient uniquement de la méthode add. Le reste fonctionne très bien (en plus c'est pa moi qui l'est écris le reste;) ).
Et pour ça:
for(int i=x[0]-y[0];i<x[0]+1;i--)
Je l'avais modifié en:
for(int i=x[0];i>x[0]-y[0]-1;i--)
et ca marche toujours pas d'ailleurs


Message édité par jeszz le 10-12-2009 à 23:09:03
Reply

Marsh Posté le 10-12-2009 à 23:20:35    

Lis le message d'Amonchakai, parce que si tu ne sais pas ce que fais ce morceau de code, tout le reste va foirer misérablement par la suite (c'est à dire, quasiment tout) :

Code :
  1. int* nbr = new int (lg+1);


Reply

Marsh Posté le 10-12-2009 à 23:36:19    

Je comprends pas le  problème avec cette ligne. On crée un tableau de taille lg+1, non?
Au passage, je reprécise que non seulement je compile cette partie, mais en plus, j'arrive à l'exécuter


Message édité par jeszz le 10-12-2009 à 23:37:12
Reply

Marsh Posté le 10-12-2009 à 23:53:35    

new int(lg+1) cree un int contenant lg+1
new int[lg+1] cree un tableau de lg+1 int
 
Encore une ecole de qualité ...

Reply

Marsh Posté le 10-12-2009 à 23:53:35   

Reply

Marsh Posté le 11-12-2009 à 00:10:17    

Oui y'avait effectivement une erreur à ce niveau. Mais pour ma défense, j'avais pas regardé de près...Merci d'avoir pris le temps de le faire.
Malheureusement, ça ne marche toujours pas. Ca refuse de compiler juste après la méthode création (qui crée les tableaux), c'est à dire:
 
#include<iostream>
using namespace std;
int* creation (void)
{
     int lg;
     cin >> lg;
     int* nbr = new int [lg+1];
     for (int i = 1; i < lg + 1; i++)
     {
        cin >> nbr[i];
     }
     nbr[0]= lg;
     return (nbr);
}

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed