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 / difftime .. Erreur utilisation ? BUG ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Ingenieur BE
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingenieur BE

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Par défaut mktime / difftime .. Erreur utilisation ? BUG ?
    Bonjour,

    Voici le contexte : dans le cadre d'une modification de firmware (je travaille sur microcontrôleur), faute de place j'ai voulu remplacer les fonctions difftime et mktime afin
    de les réduire a l'utilisation que j'en ai et pour réduire la taille du code ( la bibliothèque chargée pèse plus de 18Ko dans la flash). Donc j'ai fait mes fonctions, et afin de
    valider j'ai commencé a proceder a un test unitaire avec visualStudio 2019 et un projet C++ ... en bref ... je fais de la merde ... quoique :

    j'ai 2 exemples qui fonctionne avec mes fonctions ... mais pas le couple difftime / mktime ... d'ou mon interrogation.

    Je pars sur une différence de 1 journée et 1 seconde ... l'un sur le meme mois ... l'autre a 1 mois d'interval avec 2 jours et 1s .. selon ceci ( pas de test unitaire , juste mise en evidence de mon souci )

    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
    74
    75
    76
    77
    78
    79
    80
     
    	debutcoupure.tm_mday = 30;
    	debutcoupure.tm_mon = 1;
    	debutcoupure.tm_year = 100;
    	debutcoupure.tm_hour = 9;
    	debutcoupure.tm_min = 58;
    	debutcoupure.tm_sec = 0;
     
    	fincoupure.tm_mday = 31;
    	fincoupure.tm_mon = 1;
    	fincoupure.tm_year = 100;
    	fincoupure.tm_hour = 9;
    	fincoupure.tm_min = 58;
    	fincoupure.tm_sec = 1;
     
    	mktime(&fincoupure);
    	mktime(&debutcoupure);
     
    	int TempsCoupureSec = difftime(mktime(&fincoupure), mktime(&debutcoupure));
    	int TempsCoupureMn = (int)TempsCoupureSec/ 60;	//temps d arret en minute
    	cout << TempsCoupureSec << "\t/\t" << TempsCoupureMn << "\r\n";
     
    	debutcoupure.tm_mday = 30;
    	debutcoupure.tm_mon = 1;
    	debutcoupure.tm_year = 100;
    	debutcoupure.tm_hour = 9;
    	debutcoupure.tm_min = 58;
    	debutcoupure.tm_sec = 0;
     
    	fincoupure.tm_mday = 31;
    	fincoupure.tm_mon = 1;
    	fincoupure.tm_year = 100;
    	fincoupure.tm_hour = 9;
    	fincoupure.tm_min = 58;
    	fincoupure.tm_sec = 1;
     
     
    	TempsCoupureSec = _diff(fincoupure, debutcoupure);
    	TempsCoupureMn = (int)TempsCoupureSec / 60;	//temps d arret en minute
    	cout << TempsCoupureSec << "\t/\t" << TempsCoupureMn << "\r\n";
     
    	cout << "**************************************************************\r\n";
    	//-------------------------------------------------------------------------------------//
    	//-------------------------------------------------------------------------------------//
    	debutcoupure.tm_mday = 30;
    	debutcoupure.tm_mon = 1;
    	debutcoupure.tm_year = 100;
    	debutcoupure.tm_hour = 9;
    	debutcoupure.tm_min = 58;
    	debutcoupure.tm_sec = 0;
     
    	fincoupure.tm_mday = 1;
    	fincoupure.tm_mon = 2;
    	fincoupure.tm_year = 100;
    	fincoupure.tm_hour = 9;
    	fincoupure.tm_min = 58;
    	fincoupure.tm_sec = 1;
     
    	TempsCoupureSec = difftime(mktime(&fincoupure), mktime(&debutcoupure));
    	TempsCoupureMn = (int)TempsCoupureSec / 60;	//temps d arret en minute
    	cout << TempsCoupureSec << "\t/\t" << TempsCoupureMn << "\r\n";
     
    	debutcoupure.tm_mday = 30;
    	debutcoupure.tm_mon = 1;
    	debutcoupure.tm_year = 100;
    	debutcoupure.tm_hour = 9;
    	debutcoupure.tm_min = 58;
    	debutcoupure.tm_sec = 0;
     
    	fincoupure.tm_mday = 1;
    	fincoupure.tm_mon = 2;
    	fincoupure.tm_year = 100;
    	fincoupure.tm_hour = 9;
    	fincoupure.tm_min = 58;
    	fincoupure.tm_sec = 1;
     
     
    	TempsCoupureSec = _diff(fincoupure, debutcoupure);
    	TempsCoupureMn = (int)TempsCoupureSec / 60;	//temps d arret en minute
    	cout << TempsCoupureSec << "\t/\t" << TempsCoupureMn << "\r\n";
    le resultat est celui ci :

    DIFFTIME : 86401 / 1440
    MA FONCTION : 86401 / 1440
    **************************************************************
    DIFFTIME : 1 / 0
    MA FONCTION : 172801 / 2880

    Le problème est le même si je l'implémente dans mon µC

    Alors ... je n'ai pas la prétention d'avoir trouvé un BUG que personne n'a vu car il est tellement gros que j'en suis le premier étonné .. Mais si quelqu'un peut
    me dire ou est mon erreur ? ou ce que je comprend mal ?

    Merci d'avance et bonne dev à tous

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par défaut
    Bonjour,
    tu crées de drôles de dates 🤔

    Citation Envoyé par man page mktime
    Broken-down time is stored in the structure tm, which is defined in <time.h> as follows:

    struct tm {
    int tm_sec; /* Seconds (0-60) */
    int tm_min; /* Minutes (0-59) */
    int tm_hour; /* Hours (0-23) */
    int tm_mday; /* Day of the month (1-31) */
    int tm_mon; /* Month (0-11) */
    int tm_year; /* Year - 1900 */
    int tm_wday; /* Day of the week (0-6, Sunday = 0) */
    int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
    int tm_isdst; /* Daylight saving time */
    };

    The members of the tm structure are:

    tm_sec The number of seconds after the minute, normally in the range 0 to 59, but can be up to 60 to allow for leap seconds.

    tm_min The number of minutes after the hour, in the range 0 to 59.

    tm_hour The number of hours past midnight, in the range 0 to 23.

    tm_mday The day of the month, in the range 1 to 31.

    tm_mon The number of months since January, in the range 0 to 11.




    The mktime() function modifies the fields of the tm structure as follows: tm_wday and tm_yday are set to values determined from the contents of the other fields; if structure members are outside their valid interval, they will be normalized (so that, for example, 40 October is changed into 9 November);

    Du coup tu demandes une différence entre le {.tm_day=30, .tm_mon=1, .tm_year=100, …}=30 février 2000, normalisé en 1 mars 2000 (2000 est bisextile) 09H58'00" et le {.tm_day=1, .tm_mon=2, .tm_year=100, …}=1 mars 2000 09H58'01" → cela donne bien une différence de 1s.

  3. #3
    Membre averti
    Profil pro
    Ingenieur BE
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingenieur BE

    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Par défaut
    desolé .... sujet close ....

    int tm_mday; // day of month from 1 to 31
    int tm_mon; // month of year from 0 to 11

    0 to 11 .... serieux .... pourquoi alors le mday est pas 0 to 30 dans ce cas .....

    Merci pour ta reponse ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    et attention quand on utilise la struct tm, les champs non utilisés doivent être mis à 0 en particulier tm_isdst qui ajoute un décalage potentiel de +/- 1 heures.

  5. #5
    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
    Citation Envoyé par Bartholivier Voir le message
    int tm_mday; // day of month from 1 to 31
    int tm_mon; // month of year from 0 to 11

    0 to 11 .... serieux .... pourquoi alors le mday est pas 0 to 30 dans ce cas .....
    C'est vrai que... la question est logique. Malheureusement je n'ai pas la réponse
    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. [Erreur] Utilisation du "Run as"
    Par guilopouloos dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 07/02/2007, 10h30
  2. Erreur utilisation des commandes shell
    Par paolo2002 dans le forum Windows XP
    Réponses: 7
    Dernier message: 05/11/2006, 14h09
  3. erreur : utilisation incorrecte du mot clé
    Par StyleXP dans le forum Bases de données
    Réponses: 3
    Dernier message: 22/02/2006, 09h24
  4. Erreur utilisation de type indéfini
    Par hanane_iaai dans le forum C++
    Réponses: 3
    Dernier message: 04/07/2005, 17h34
  5. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44

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