Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1395 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1948950
jeszz
Posté le 10-12-2009 à 10:55:37  profilanswer
 

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);}

mood
Publicité
Posté le 10-12-2009 à 10:55:37  profilanswer
 

n°1948960
Joel F
Real men use unique_ptr
Posté le 10-12-2009 à 11:14:23  profilanswer
 

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

n°1948966
jeszz
Posté le 10-12-2009 à 11:26:17  profilanswer
 

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

n°1949058
Joel F
Real men use unique_ptr
Posté le 10-12-2009 à 15:02:47  profilanswer
 
n°1949099
tpierron
Posté le 10-12-2009 à 15:53:08  profilanswer
 

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
n°1949226
Amonchakai
Posté le 10-12-2009 à 20:36:59  profilanswer
 

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
n°1949255
jeszz
Posté le 10-12-2009 à 23:03:37  profilanswer
 

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
n°1949257
tpierron
Posté le 10-12-2009 à 23:20:35  profilanswer
 

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);


n°1949259
jeszz
Posté le 10-12-2009 à 23:36:19  profilanswer
 

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
n°1949265
Joel F
Real men use unique_ptr
Posté le 10-12-2009 à 23:53:35  profilanswer
 

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é ...

mood
Publicité
Posté le 10-12-2009 à 23:53:35  profilanswer
 

n°1949267
jeszz
Posté le 11-12-2009 à 00:10:17  profilanswer
 

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);
}


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[KSH][RESOLU]Enlever $ situé en fin de chaine s'il existe [HELP]Help !!!! utiliser gtk+2.0 avec gcc (->NetBeans) sous OpenSolaris
Redirection 301 qui ne fonctionne pas : help !Help: html/php basic
[RESOLU] Probleme couleur PC et MAC en HTML!! HELP PLZ :)Cherche code !!! help
Jointure entre 3 tables ! Help please[Help] Création de composant web : Widget or not widget ???
[help] copie de fichier et renomage si doublon[JAVASRIPT] HELP ! Chargement page en fonction d'un test sur TEXTAREA
Plus de sujets relatifs à : Help!! Ca compile mais après ca "cesse de fonctionner"


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR