IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

invalid read & write dans une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Par défaut invalid read & write dans une fonction
    Bonjour,
    j'ai codé une petite fonction de calcul sur grands nombres. Les nombres sont envoyés sous forme de chaîne de caracteres, l'operation est réalisée, le resultat stocké dans une autre chaine qui est retournée et tout devrait bien se passer.
    Le probleme c'est qu'en faisant tourner Valgrind, j'obtiens beacoup d'erreurs d'ecritures et de lectures invalides dans cette fonction. Et j'ai beau la tourner dans tous les sens, je ne vois pas ce qui euh ne vas pas.
    Les erreurs viennent pour la plupart de strln() (invalid read), et des c[i] (invalid read ou invalid write)
    Par exemple pour la multiplication, mon code donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    void bigMultiplication(char const *a, char const *b, char *c)
    {
      /* taille de a */
      int szA = strlen( a );
      /* taille de b */
      int szB = strlen ( b );
      /* taille de c */
      int szC = szA + szB;
      int i, j;
      memset ( c, 0, ( 1 + szC ) * sizeof *c );
      for ( i = 0; i < szA; i++ )
      {
        // Retenue
        int cr = 0;
        for ( j = 0; j < szB || cr; j++ )
        {
     
          int tmp = c[i + j] + cr;
     
          if ( j < szB )
          {
    	tmp += ( a[ szA - i - 1] - '0') *
    	( b[ szB - j - 1] - '0');
          }
          cr = tmp / 10;
          if ( cr )
          {
    	tmp %= 10;
          }
          c[i + j] = tmp;
        }
      }
      for ( i = 0; i < szC; i++ )
      {     
        c[i] += '0';
      }
      transforme ( c );
    }
    où a et b sont les deux operandes, c est le résultat. transforme() enlève les zéros inutile et retourne c pour avoir le résultat correct.
    Si une bonne âme pouvait jeter un regard neuf la dessus ce serait sympa, car je travaille seul et je ne vois pas ce qui cloche.
    Merci!

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Que valent a, b et c quand tu appelles la fonction?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Par défaut
    Oui j'ai oublié de préciser ça.
    En fait j'obtiens a et b grâce à la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    char* convert(integer a)
    {
      char * stab;
      int i = snprintf(NULL,0,"%lld",a);
      stab = malloc((i+2)*sizeof(char));
      if(stab != NULL)
      {
        snprintf(stab,i+1,"%lld%c",a,'\0');
        // printf("stab en i et i+1:%c et %c\n",stab[i],stab[i+1]);
      } 
      else
      {
        printf("Failure in memory allocation in %s / %d\n",__FILE__,__LINE__);
        return NULL;
      }
      return stab;
    }
    qui prend en entier en entrée et retourne la chaine correspondante.
    integer correspond à un unsigned long int.
    Quand à c, c'est soit une chaine statique vide (par ex buff[200]) soit un resultat precedent que j'écrase.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu devrais passer la taille de c en paramètre de la fonction, et vérifier avec la valeur de szC...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  2. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  3. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  4. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 20h42
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo