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 :

probleme avec difftime


Sujet :

C

  1. #1
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut probleme avec difftime
    Bonjour,

    J'ai une erreur de segmentation lorsque j'execute ce code:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    int calcul_age(struct cache struct_cache)
    {
    time_t now;
    struct tm tmdate_value,*tmdate_now;
    double corrected_received_age;
     
    printf("debut calcul_age:\n");
    if(!formatage_heure(struct_cache,"Date",&tmdate_value))
       return 0;
     
    time(&now); // date et heure actuel
     
    // convertit la  date  now  en  une  représentation struct  tm  exprimée en Temps Universel (GMT)
    if(gmtime_r (&now,tmdate_now) == NULL)
       perror("gmtime_r");
     
    printf("date now GMT:\n");
     
       /* Affiche la date et l'heure courante (format français) */
      printf ("Nous sommes %s, ", NomJourSemaine[tmdate_now -> tm_wday]);
       printf ("le %02u %s %04u, ", tmdate_now -> tm_mday, NomMois[tmdate_now -> tm_mon], 1900 +tmdate_now -> tm_year);
       printf ("et il est %02uh %02umin %02usec.\n", tmdate_now -> tm_hour, tmdate_now -> tm_min, tmdate_now -> tm_sec);
       printf ("\n");
     
       /* Affiche la date et l'heure courante (format français) */
        printf("date cache:\n");
      printf ("le %02u %s %04u, ", tmdate_value.tm_mday, NomMois[tmdate_value.tm_mon], 1900 +tmdate_value.tm_year);
       printf ("et il est %02uh %02umin %02usec.\n", tmdate_value.tm_hour, tmdate_value.tm_min,tmdate_value.tm_sec);
       printf ("\n");
     
     
     
    corrected_received_age=mktime(&tmdate_value);
    printf("%.0f\n",corrected_received_age);
     
    corrected_received_age=mktime(tmdate_now);
    printf("%.0f\n",corrected_received_age);
     
     
     
    corrected_received_age=difftime(mktime(tmdate_now),mktime(&tmdate_value));
    printf("%.0f\n",corrected_received_age);
     
     
    //printf("La difference est : %.0f\n\n",difftime (mktime(tmdate_now), mktime(&tmdate_value)));
     
    //  time_t mktime (struct tm *tm);
     
    //difftime (today, mktime (&date_cache))
    //double difftime (time_t time1, time_t time0);
    }
    mktime(&tmdate_value) et mktime(tmdate_now) fonctionnent tres bien, lorsque je mets les commentaires sur corrected_received_age=difftime(mktime(tmdate_now),mktime(&tmdate_value)); J'ai ceci:

    debut calcul_age:
    date now GMT:
    Nous sommes Mercredi, le 27 Decembre 2006, et il est 14h 11min 08sec.

    date cache:
    le 27 Decembre 2006, et il est 10h 48min 00sec.

    1167212880
    1167225068
    le probleme c'est corrected_received_age=difftime(mktime(tmdate_now),mktime(&tmdate_value)); Lorsque j'enleve les commentaires j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    debut calcul_age:
    Erreur de segmentation
    Je ne comprend pas ce qui ne va pas. Surtout que ca marchait tres bien jusqu'a ce que je renomme tmdate_value et tmdate_now. au depart ils s'appelaient date_value et date_now et difftime fontionnait bien. j'ai juste renommé et depuis cela ne marche plus meme si je les renomment comme avant. Qu'est ce qui ne va pas ?

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semaj_james
    J'ai une erreur de segmentation lorsque j'execute ce code:
    Ce code est incomplet. On ne peut pas le tester.

  3. #3
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    int calcul_age(void)
    {
    time_t now;
    struct tm tmdate_value,*tmdate_now;
    double corrected_received_age;
     
    printf("debut calcul_age:\n");
    /*if(!formatage_heure(struct_cache,"Date",&tmdate_value))
       return 0;
     
    */
     
       tmdate_value.tm_mon = 11;    /* mois */
       tmdate_value.tm_mday = 12;   /*  jour */
       tmdate_value.tm_hour = 10;   /* heure */
       tmdate_value.tm_min = 12;   /* minute */
       tmdate_value.tm_sec = 15;   /* seconde */
       tmdate_value.tm_year = 2000-1900;   /* annee 2000= 1900 + 100 annees  */
     
    time(&now); // date et heure actuel
     
    // convertit la  date  now  en  une  représentation struct  tm  exprimée en Temps Universel (GMT)
    if(gmtime_r (&now,tmdate_now) == NULL)
       perror("gmtime_r");
     
    printf("date now GMT:\n");
     
       /* Affiche la date et l'heure courante (format français) */
      printf ("Nous sommes %s, ", NomJourSemaine[tmdate_now -> tm_wday]);
       printf ("le %02u %s %04u, ", tmdate_now -> tm_mday, NomMois[tmdate_now -> tm_mon], 1900 +tmdate_now -> tm_year);
       printf ("et il est %02uh %02umin %02usec.\n", tmdate_now -> tm_hour, tmdate_now -> tm_min, tmdate_now -> tm_sec);
       printf ("\n");
     
       /* Affiche la date et l'heure courante (format français) */
        printf("date cache:\n");
      printf ("le %02u %s %04u, ", tmdate_value.tm_mday, NomMois[tmdate_value.tm_mon], 1900 +tmdate_value.tm_year);
       printf ("et il est %02uh %02umin %02usec.\n", tmdate_value.tm_hour, tmdate_value.tm_min,tmdate_value.tm_sec);
       printf ("\n");
     
     
    corrected_received_age=mktime(&tmdate_value);
    printf("%.0f\n",corrected_received_age);
     
    corrected_received_age=mktime(tmdate_now);
    printf("%.0f\n",corrected_received_age);
     
    //corrected_received_age=difftime(mktime(tmdate_now),mktime(&tmdate_value));
    //printf("%.0f\n",corrected_received_age);
     
    //printf("La difference est : %.0f\n\n",difftime (mktime(tmdate_now), mktime(&tmdate_value)));
     
    //  time_t mktime (struct tm *tm);
     
    //difftime (today, mktime (&date_cache))
    //double difftime (time_t time1, time_t time0);

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semaj_james
    Pas mieux...
    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
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `calcul_age':
    main.c:3: error: `time_t' undeclared (first use in this function)
    main.c:3: error: (Each undeclared identifier is reported only once
    main.c:3: error: for each function it appears in.)
    main.c:3: error: syntax error before "now"
    main.c:4: error: storage size of 'tmdate_value' isn't known
    main.c:6: warning: implicit declaration of function `printf'
    main.c:13: warning: implicit declaration of function `time'
    main.c:13: error: `now' undeclared (first use in this function)
    main.c:15: warning: implicit declaration of function `gmtime_r'
    main.c:15: error: `NULL' undeclared (first use in this function)
    main.c:16: warning: implicit declaration of function `perror'
    main.c:18: error: `NomJourSemaine' undeclared (first use in this function)
    main.c:18: error: dereferencing pointer to incomplete type
    main.c:19: error: dereferencing pointer to incomplete type
    main.c:20: error: `NomMois' undeclared (first use in this function)
    main.c:20: error: dereferencing pointer to incomplete type
    main.c:20: error: dereferencing pointer to incomplete type
    main.c:21: error: dereferencing pointer to incomplete type
    main.c:22: error: dereferencing pointer to incomplete type
    main.c:22: error: dereferencing pointer to incomplete type
    main.c:30: warning: implicit declaration of function `mktime'
    main.c:4: warning: unused variable `tmdate_value'
    Process terminated with status 1 (0 minutes, 1 seconds)
    16 errors, 6 warnings

  5. #5
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <time.h>
     
    const char *NomJourSemaine[] =
    {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
     
    const char *NomMois[] =
    {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout",
    "Septembre", "Octobre", "Novembre", "Decembre"};
     
    const char *NomMoisEn[] =
    {"Jan" , "Feb" , "Mar" , "Apr", "May" , "Jun" , "Jul" , "Aug", "Sep" , "Oct" , "Nov" , "Dec"};

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semaj_james
    Je n'ai pas de gmtime_r() (pas standard C).
    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
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `calcul_age':
    main.c:28: warning: implicit declaration of function `gmtime_r'
    main.c:28: warning: comparison between pointer and integer
    main.c:53: warning: control reaches end of non-void function
    main.c:17: warning: 'tmdate_now' might be used uninitialized in this function
    Linking console executable: C:\dev\forums2\console.exe
    .objs\dev\forums2\main.o: In function `calcul_age':
    C:/dev/forums2/main.c:28: undefined reference to `gmtime_r'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 4 seconds)
    1 errors, 4 warnings

  7. #7
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(gmtime_r (&now,tmdate_now) == NULL)
       perror("gmtime_r");
    mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmdate_now=gmtime(&now);
    Il me semble que c'est standard:
    Les versions réentrantes asctime_r(), ctime_r(), gmtime_r() et localtime_r() sont mentionnées dans SUSv2, et disponibles depuis la libc 5.2.5.

    CONFORMITÉ
    SVr4, POSIX.1-2001, BSD 4.3, C89, C99.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semaj_james
    a la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(gmtime_r (&now,tmdate_now) == NULL)
       perror("gmtime_r");
    mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmdate_now=gmtime(&now);
    Il me semble que c'est standard:
    Non.

    Attention, gmtime() retourne l'adresse d'une variable statique. Pour conserver les valeurs, il faut faire une copie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       struct tm tmdate_now;
     
       tmdate_now = *gmtime(&now);
    La fonction 'calcul_age()' retourne un int, mais il n'y a rien de tel dans le code...

    Pour formater des dates en texte, il vaut mieux utiliser strftime(), c'est fait pour...

    Attention a initialiser les structures tm à 0 avant usage...

    Ceci fonctionne (sauf la localisation... mais sous Windows, ça ne m'étonne pas trop...) :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    #include <time.h>
    #include <stdio.h>
    #include <locale.h>
     
    int calcul_age (void)
    {
       time_t now = time (NULL);    // date et heure actuel
     
       struct tm tmdate_value = { 0 };
       struct tm tmdate_now;
       double corrected_received_age;
     
       printf ("debut calcul_age:\n");
     
       tmdate_value.tm_mon = 12 - 1; /* mois */
       tmdate_value.tm_mday = 12;   /*  jour */
       tmdate_value.tm_hour = 10;   /* heure */
       tmdate_value.tm_min = 12;    /* minute */
       tmdate_value.tm_sec = 15;    /* seconde */
       tmdate_value.tm_year = 2000 - 1900; /* annee 2000= 1900 + 100 annees  */
     
    // convertit la  date  now  en  une  représentation struct  tm  exprimée en Temps Universel (GMT)
       tmdate_now = *gmtime (&now);
     
       printf ("date now GMT:\n");
     
       /* Affiche la date et l'heure courante (format français) */
       {
          char sdate[128];
     
          strftime (sdate, sizeof sdate,
                    "Nous sommes %A, le %d %B %Y et il est %H:%M:%S",
                    &tmdate_now);
     
          printf ("%s\n", sdate);
     
          /* Affiche la date et l'heure courante (format français) */
          printf ("date cache:\n");
          strftime (sdate, sizeof sdate,
                    "Nous sommes %A, le %d %B %Y et il est %H:%M:%S",
                    &tmdate_value);
     
          printf ("%s\n", sdate);
       }
     
       corrected_received_age = mktime (&tmdate_value);
       printf ("%.0f\n", corrected_received_age);
     
       corrected_received_age = mktime (&tmdate_now);
       printf ("%.0f\n", corrected_received_age);
     
    //corrected_received_age=difftime(mktime(tmdate_now),mktime(&tmdate_value));
    //printf("%.0f\n",corrected_received_age);
     
    //printf("La difference est : %.0f\n\n",difftime (mktime(tmdate_now), mktime(&tmdate_value)));
     
    //  time_t mktime (struct tm *tm);
     
    //difftime (today, mktime (&date_cache))
    //double difftime (time_t time1, time_t time0);
     
    }
     
    int main (void)
    {
       setlocale (LC_TIME, "fr_FR");
     
       int age = calcul_age ();
     
       printf ("age = %d\n", age);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    debut calcul_age:
    date now GMT:
    Nous sommes Wednesday, le 27 December 2006 et il est 22:24:39
    date cache:
    Nous sommes Sunday, le 12 December 2000 et il est 10:12:15
    976612335
    1167254679
    age = 11
     
    Press ENTER to continue.

  9. #9
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    merci.

    apparement le probleme etait le manque d'initialisation de tmdate_value et le fait d'avoir declarer *tmdate_now comme un pointeur. Cela fonctionne si l'on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct tm tmdate_value={0},tmdate_now;
    printf("%.0f\n",difftime(mktime(&tmdate_now),mktime(&tmdate_value)));
    pour ton code j'ai 2 warnings sur struct tm tmdate_value ={0}; :
    essai.c: In function ‘calcul_age’:
    essai.c:9: attention : initialisation manquante
    essai.c:9: attention : (near initialization for ‘tmdate_value.tm_min’)

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par semaj_james
    pour ton code j'ai 2 warnings sur struct tm tmdate_value ={0}; :
    Oui, tu peux ignorer. Les autres champs sont automatiquement mis à 0.

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

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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