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 :

dates et segfault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 94
    Par défaut dates et segfault
    Bonjour,

    J'essaye de faire de la manipulation de dates en C (je débute en C), j'ai donc commencé par vouloir transformer une date (format dd/mm/YYYY) en timestamp.

    Voici ma source:
    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
    #include <stdio.h>
    #include <time.h>
     
    char *test = "23/06/2003";
     
    void main(char *test) {
       double tmp;
       char s[10];
       printf("Orig : %s\n", test);
       tmp = getDate(test);
       printf("TS : %d\n", tmp);
    }
     
    double getDate( char *mdate) {
       struct tm t;
       double tbday = 0;
       char s[10];
       printf("Having date: %s\n", mdate);
       if (sscanf(mdate, "%d/%d/%d", t.tm_mday, t.tm_mon, t.tm_year) == 3) {
          t.tm_mon -= 1;
          t.tm_year -= 1900;
          t.tm_hour = 12;
          t.tm_min = 0;
          t.tm_sec = 0;
          t.tm_isdst = 0;
          if (strcmp(strftime(s, 10, "%d/%m/%Y", &t), mdate) == 0) {
             tbday = mktime(&t);
          }
       }
       return tbday;
     
    }
    Je le compile bien, sans warning ni erreur, mais sitôt que je veux le lancer, j'ai une erreur de segmentation, je ne vois pas ce qui peut provoquer cela.

    Et mon but est de comparer la date donnée avec la date du jour (pour obtenir un âge), est-ce que cela pourra fonctionner avec des dates de naissance d'avant 1970 ?

    Merci de votre aide !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 119
    Par défaut
    Bonjour,

    Citation Envoyé par CrazyCat Voir le message
    Je le compile bien, sans warning ni erreur,
    J'en doute:

    Code Shell : 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
    $ gcc -o t -Wall t.c
    t.c:6: warning: return type of 'main' is not `int'
    t.c:6: warning: first argument of 'main' should be `int'
    t.c:6: warning: 'main' takes only zero or two arguments
    t.c: In function `main':
    t.c:10: warning: implicit declaration of function `getDate'
    t.c:11: warning: int format, double arg (arg 2)
    t.c:11: warning: int format, double arg (arg 2)
    t.c:8: warning: unused variable `s'
    t.c: At top level:
    t.c:14: error: conflicting types for 'getDate'
    t.c:10: error: previous implicit declaration of 'getDate' was here
    t.c: In function `getDate':
    t.c:19: warning: format argument is not a pointer (arg 3)
    t.c:19: warning: format argument is not a pointer (arg 4)
    t.c:19: warning: format argument is not a pointer (arg 5)
    t.c:19: warning: format argument is not a pointer (arg 3)
    t.c:19: warning: format argument is not a pointer (arg 4)
    t.c:19: warning: format argument is not a pointer (arg 5)
    t.c:26: warning: implicit declaration of function `strcmp'
    t.c:26: warning: passing arg 1 of `strcmp' makes pointer from integer without a cast

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    salut!

    regarde le contenu de time.h pour avoir time_t car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    time_t	mktime (struct tm*);
    c'est probablement un long.

    la seule fonction de time.h comportant un double est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double	difftime (time_t, time_t);
    A+

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 94
    Par défaut
    Ok, j'apprends les options de gcc avant de demander

    Donc, en utilisant tes options, j'arrive à compiler sans erreur ni warning, et à presque faire fonctionner mon système, il me semble que j'ai un bug assez bloquant sur l'année.

    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
    #include <stdio.h>
    #include <time.h>
    #include <string.h>
     
    double getDate( char *mdate);
     
    int main() {
       char *test = "23/06/2003";
       double tmp;
       printf("Orig : %s\n", test);
       tmp = getDate(test);
       printf("TS : %f\n", tmp);
       return 1;
    }
     
    double getDate( char *mdate) {
       struct tm t;
       double tbday = 0;
       char s[10];
       printf("Having date: %s\n", mdate);
       if (sscanf(mdate, "%d/%d/%d", &t.tm_mday, &t.tm_mon, &t.tm_year) == 3) {
          printf("Y verification: %d\n", t.tm_year);
          t.tm_mon -= 1;
          t.tm_year -= 1900;
          t.tm_hour = 12;
          t.tm_min = 0;
          t.tm_sec = 0;
          strftime(s, 10, "%d/%m/%Y", &t);
          printf("Gives : %s\n", s);
          if (strcmp(mdate, s) == 0) {
             tbday = mktime(&t);
          }
       }
       return tbday;
    }
    Sortie:
    ~$ ./a.out
    Orig : 23/06/2003
    Having date: 23/06/2003
    Y verification: 2003
    Gives : 23/06/
    TS : 0.000000
    Donc, l'année est bien extraite, mais ne semble pas prise en compte. WTF ?

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 94
    Par défaut
    Petite correction !

    Après lecture du post d'anacharsis (un grand merci), j'ai passé mes "double" en "long" et j'ai commencé à voir l'année.
    J'ai donc modifié la longueur de s et ça fonctionne très bien.

    Je vais donc pouvoir m'attaquer à difftime pour mon calcul d'âge.

    Merci de votre aide !

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Si ton problème est résolu, clique sur le bouton

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 23/07/2002, 14h33
  2. soustraire deux dates ?
    Par joejoe dans le forum SQL
    Réponses: 2
    Dernier message: 19/07/2002, 15h53
  3. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21
  4. Réponses: 3
    Dernier message: 06/05/2002, 18h24
  5. Réponses: 3
    Dernier message: 19/04/2002, 00h11

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