Heures, minutes, secondes...

Résolu
Bonsoir,

J'ai un petit problème en C. Je souhaite que mon programme renvoie, à partir des secondes entrées par l'utilisateur, l'équivalent en jours, heures, minutes, secondes.
Tout fonctionne, sauf dans certains cas. Par exemple, lorsque j'entre
6849684141698168161
en secondes, j'obtiens
-23001 jours, -12 heures, -52 minutes et -47 secondes

Ou lorsque j'entre
100000000000000000000000000000000000000000
secondes, j'obtiens des 0 jours, 0 heures, 0 minutes, 0 secondes...
Alors que par exemple avec
7445622
j'obtiens bien
8 jours, 14 heures, 49 minutes et 22 secondes
.
Le problème viendrait-il de la capacité de stockage de long int ?

Voici le code :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void clock(int* jours, int* heures, int* minutes, int* secondes);

int main(int argc, char *argv[])
{
    long int jours = 0, heures = 0, minutes = 0, secondes;
    scanf("%d", &secondes);

    clock(&jours, &heures, &minutes, &secondes);

    printf("%d jours, %d heures, %d minutes et %d secondes",jours ,heures, minutes, secondes);

    return 0;
}

void clock(int* jours, int* heures, int* minutes, int* secondes)
{
    *jours = (*secondes/3600)/24;
    *heures = *secondes / 3600;
    *minutes = *secondes / 60;
    *secondes = *secondes % 60;
    *minutes = *minutes % 60;
    *heures = *heures % 24;
}


Merci.
<\EchoIsON>
.

4 réponses

  1. Merci à tous, [Dal] je prend en compte le conseil.

    En effet il y a une incohérence avec long int et int dans la fonction mais le problème était toujours présent même avant que je change int en long int.
    fiddy, est-ce-que je pourrais avoir plus de précisions sur la bibliothèque BIGNUM, svp ?

    Voici le code modifié :
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    void heure(long int* siecles, long int* annees, long int* mois, long int* jours, long int* heures, long int* minutes, long int* secondes);
    
    int main(int argc, char *argv[])
    {
        long int siecles = 0, annees = 0, mois = 0, jours = 0, heures = 0, minutes = 0, secondes;
        scanf("%d", &secondes);
    
        heure(&siecles, &annees, &mois, &jours, &heures, &minutes, &secondes);
    
        printf("%d siecles, %d ans, %d mois, %d jours, %d heures, %d minutes et %d secondes", siecles, annees, mois, jours ,heures, minutes, secondes);
    
        return 0;
    }
    
    void heure(long int* siecles, long int* annees, long int* mois, long int* jours, long int* heures, long int* minutes, long int* secondes)
    {
        *siecles = ((((*secondes/3600)/24)/30)/12)/100;
        *annees = (((*secondes/3600)/24)/30)/12;
        *mois = ((*secondes/3600)/24)/30;
        *jours = (*secondes/3600)/24;
        *heures = *secondes / 3600;
        *minutes = *secondes / 60;
        *secondes = *secondes % 60;
        *minutes = *minutes % 60;
        *heures = *heures % 24;
        *jours = *jours % 30;
        *mois = *mois % 12;
        *annees = *annees % 100;
    }
    /* J'ai rajouté certaines modifications entre temps...*/
    


    EDIT : J'ai rajouté unsigned lont int, je pense que cela m'offre une solution partielle... Au moins je n'ai plus de valeurs négatives.

    Merci, EchoIsON.
    1. Contributeur
      As-tu regardé du côté des long long comme dit dans mon précédent post ? Ce n'est pas assez ?
      Sinon, pour les bignum, cela s'éloigne du C. Je ne vais donc pas pouvoir beaucoup t'aider.
      Un petit lien : http://etutorials.org/Programming/secure+programming/Chapter+7.+Public+Key+Cryptography/7.4+Manipulating+Big+Numbers/
    2. Avec long long int, j'obtiens des 0 partout, et ce pour n'importe quelle valeur, même petite... Je pense que je ne vais pas me lancer plus loin que le C, j'essaie deja de maitriser les bases. Merci tout de même.
    3. Avec juste "unsigned long long", en entrant 500000 secondes, j'obtiens 5 secondes...

      EDIT : En fait, long long et long long int cela revient au même non ?
    4. Contributeur
      @Utilisateur anonymeOui long long = long long int.
      Note, as-tu bien changé les formats ? Par exemple dans les scanf() c'est %lld, etc.
      N'hésite pas à montrer ton code avec les long long, si tu souhaites qu'on jette un coup d'oeil.
    5. Modérateur
      Juste une remarque dans :
      scanf("%d", &secondes);
      ce ne serait pas %ld plutôt ?