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 :

Conversion d'un entier en date


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Par défaut Conversion d'un entier en date
    Bonjour à tous,

    Dans le cadre d'un projet pour mes études, je dois créer ma propre commande tar. Pour ce faire, j'ai besoin de convertir un entier en date.

    J'ai le nombre de seconde depuis le 1 janvier 1970 (timestamp) en char* et en octal que je converti ensuite en long long et en décimal. Je transforme ensuite ce nombre de type long long en date à l'aide de la fonction ctime mais je reçois à chaque fois une erreur de type "malloc() : memory corruption".

    Ci-dessous se trouve le code, si quelqu'un a une idée sur la provenance de l'erreur ou une amélioration de mon code, je suis preneuse

    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
     
    //Convertir un octal en décimal (char* --> long long)
    long long octalToLongDecimal(char* octalNumber)
    {
      long long decimal = 0;
      int iterator = 0;
      long long octal = atoll(octalNumber);
     
      while(iterator < 12)
      {
        decimal = decimal + (octal % 10) * pow(8,iterator++);
        octal = octal/10;
      }
     
      return decimal;
    }
     
    char* getDate(char mtime[12])
    {
      long long seconds = octalToLongDecimal(mtime);
      time_t time = (time_t)seconds;
      char *p = ctime(&time);
      return p;
    }
    Merci.

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonsoir,

    Je vais supposer que tu es sous linux.
    En général un message "memory corruption" si tu utilises la glibc signifie simplement soit que tu écris dans de la mémoire non allouée, que tu continues d'accéder à de la mémoire déjà libérée, de libérer de la mémoire déjà libérée ou de libérer de la mémoire qui n'a pas été mallocée.
    Ton code et tes symptômes semblent indiquer que c'est ce dernier cas qui te concerne.
    Je suppose (mais il faudrait voir un peu plus de code) que tu essayes de faire un free sur la chaîne renvoyée par ton getDate. Cette chaîne provient de ctime qui renvoie une chaîne statique = de la mémoire non allouée par malloc qui est réutilisée à chaque appel de ctime.

    Citation Envoyé par melw67 Voir le message
    Ci-dessous se trouve le code, si quelqu'un a une idée sur la provenance de l'erreur ou une amélioration de mon code, je suis preneuse
    [...]
    Merci.
    Comme amélioration, je te propose d'utiliser strtoll plutôt que atoll. Cela te permettra non seulement de repérer si la conversion échoue, mais aussi de spécifier une base pour la conversion. Utiliser pow n'est pas non plus recommandé, il vaut mieux pour des conversions de bases utiliser des multiplications cumulées (algorithme de horner).
    Et finalement dupliquer la chaîne renvoyée par ctime.

  3. #3
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...je reçois à chaque fois une erreur de type "malloc() : memory corruption".
    Dans ce cas l'erreur est ailleurs... il faut nous montrer le reste du code.

    Sinon je te suggère de remplacer atoll par strtoll, cela t'évitera de faire la conversion octal -> decimal, en gros tu n'as plus besoin de octalToLongDecimal():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <...>
    //long long seconds = octalToLongDecimal(mtime);
    long long seconds = strtoll(mtime, NULL, 8);
    <...>

    Edit: La réponse de kwariz est plus complète

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Par défaut
    Bonjour,

    Merci pour vos réponses ! Je vais remplacer atoll par strtoll, c'est en effet bien plus simple.

    En ce qui concerne le reste du code, je n'utilise aucun malloc ou free, je fais juste un printf sur la valeur reçue... C'est pourquoi je ne comprends pas d'où provient l'erreur.

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    poste ton code en entier pour que nous puissions mieux t'aider.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Par défaut Résolu
    Bonjour,

    Mon problème est résolu, merci pour votre aide. Cela n'avait rien à voir avec la fonction "ctime" mais avec la fonction que j'appelais après où j'allouais mal la mémoire, merci à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion d'un entier en byte
    Par noutnout53 dans le forum Java ME
    Réponses: 5
    Dernier message: 12/05/2006, 12h49
  2. conversion chaîne vers entier
    Par pepper18 dans le forum C++
    Réponses: 2
    Dernier message: 31/03/2006, 16h36
  3. Conversion d'un entier en char*
    Par Langly dans le forum C++
    Réponses: 15
    Dernier message: 09/02/2006, 14h38
  4. Conversion d'un entier en caractères
    Par Tcheby dans le forum Langage
    Réponses: 6
    Dernier message: 18/11/2005, 08h41
  5. conversion d'un entier en ASCII
    Par bischof dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h18

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