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 :

mktime invalid argument


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 14
    Par défaut mktime invalid argument
    Bonjour,

    J'essaye de convertir une string sous un format date : "2017-05-02 14:04:18" en time_t pour pouvoir le comparer avec la date actuelle et voir si plus de X ( = MAX_DAY_REFRESH ) se sont passés. Le problème c'est que pour changer la string time_t je la change d'abord en struc tm grâce a la fonction mktime ce qui produit une erreur. Voici mon 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
    static int compare_date(char* date)
    {
        int res = 0;
     
        struct tm tm;
        time_t time_value, now;
        double diff_t;
        char buff[MIN_SIZE];
        int a, m, j, h, min, s;
     
        sscanf(date, "%d-%d-%d %d:%d:%d", &a, &m, &j, &h, &min, &s);
        printf("compare_date : %d-%d-%d %d:%d:%d \n", a, m, j, h, min, s);
        tm.tm_year = a;
        tm.tm_mon = m;
        tm.tm_mday = j;
        tm.tm_hour = h;
        tm.tm_min = min;
        tm.tm_sec = s;
        tm.tm_isdst = -1;
        time_value = mktime(&tm); //mktime retourne -1
        now = time(NULL);
     
        printf("time_value : %f \n", (double) time_value);
        printf("now : %f \n", (double) now);
        diff_t = difftime(now, time_value);
        printf("compare_date diff_t : %f \n", diff_t);
        double time_refresh = MAX_DAY_REFRESH * 24 * 60 *60; //convertion en seconde
        if(time_refresh > diff_t)
        {
            res = 0;
        }
        else
        {
            res = 1;
        }
        return res;
    }
    En retour j'ai :
    compare_date : 2017-5-2 14:4:18
    mktime() :: invalid argument
    now : ... (un nombre)
    compare_date diff_t : 0.0000

    Je comprends bien que l'erreur viens de ma struc tm et de comment je la remplie, mais je ne vois pas comment faire autrement ...

    Merci d'avance pour toute aide

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Je ne comprends pas pourquoi tu travailles en double alors que le temps en secondes se déroule en entiers.

    Sinon de mon côté je n'ai aucune erreur avec ton code (optimisé)

    Code c : 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
    static int compare_date(char* date)
    {
    	int res = 0;
     
    	struct tm tm;
    	time_t time_value, now;
    	double diff_t;
     
    	sscanf(date, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
    	printf("compare_date : %d-%d-%d %d:%d:%d \n", tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
    	tm.tm_isdst = -1;
    	time_value = mktime(&tm); //mktime retourne -1
    	now = time(NULL);
     
    	printf("time_value : %lu \n", time_value);
    	printf("now : %lu \n", now);
    	diff_t = difftime(now, time_value);
    	printf("compare_date diff_t : %lu \n", diff_t);
    	time_t time_refresh = MAX_DAY_REFRESH * 24 * 60 *60; //convertion en seconde
     
    	return time_refresh > diff_t ?0 :1;
    }
     
    int main()
    {
    	compare_date("2017-05-04 12:15:07");
    }

    Donc en dehors de cette histoire de double et de cette suite de variables "a, m, j, h, min, s" totalement inutiles, la seule différence de notable avec ton code se situe dans ma façon d'appeler compare_date() qu'on ne voit pas chez-toi. Probable que c'est là que ça cafouille.

    Sinon la librairie standard te propose une variable globale errno qui est toujours remplie à chaque fois qu'un appel système échoue. En parallèle tu as la fonction char *strerror(int errno) qui te renvoie le texte correspondant à la valeur de errno. C'est plutôt pratique pour déterminer la raison d'une erreur...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Invalid argument supplied for foreach()
    Par Rajhonson dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2006, 14h31
  2. Réponses: 11
    Dernier message: 19/05/2006, 11h41
  3. Réponses: 26
    Dernier message: 24/03/2006, 13h44
  4. [Tableaux] Problème invalid argument foreach()
    Par kcizth dans le forum Langage
    Réponses: 9
    Dernier message: 05/01/2006, 11h56
  5. Invalid argument?
    Par Anduriel dans le forum Langage
    Réponses: 24
    Dernier message: 12/10/2005, 19h15

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