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 :

Âge de l'utilisateur


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2019
    Messages : 16
    Points : 57
    Points
    57
    Par défaut Âge de l'utilisateur
    Bonjour à tous,

    jeune développeur en devenir je bute sur un petit programme en C qui m'avait l'air simple au 1er abord... (les 1ères impressions sont définitivement mauvaises)

    Le but du programme est vraiment trivial: on demande à l'utilisateur de rentrer son année de naissance uniquement et le programme doit donc retourner son âge.
    Du coup je suis parti dans l'idée que on reprenait l'année actuelle, puis on fait la différence avec l'année de naissance. Plus simple à dire que à faire, j'ai un mal de chien à comprendre la fonction "time" que tout le monde utilise et même avec la FAQ du C -> Gestion des dates, je n'assimile pas le concept.

    Voici le code que j'ai fais jusqu'à présent

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main()
    {
        int anneeNaissance, result;
        char buffer[256];
        time_t today = time(NULL);
        strftime(buffer, sizeof(buffer), "%Y", localtime(&today));
     
     
        printf("Quel est votre année de naissance? ");
        scanf("%i", &anneeNaissance);
     
        result = buffer - anneeNaissance;
        printf("Vous avez %i ans", result);
     
        return 0;
    }
    ça compile et tout mais ça me retourne un nombre de secondes pharaonique
    Donc ma question c'est comment faire ma différence avec des années et non des secondes?

    D'avance merci pour vos réponses ^^

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ton programme ne retourne pas des secondes mais n'importe quoi.
    buffer est une chaîne de caractères et en fait une adresse.
    Tu peux faire une soustraction depuis cette adresse mais le résultat sera juste une autre adresse. Et certainement pas un nombre de secondes.
    Le compilateur n'émet aucun warning ou erreur sur cette opération ? Tu affiches bien les erreurs et warnings ?
    Si tu veux un chiffre, il faut convertir le buffer en chiffre. atoi ?

    Sinon il existe gmtime et localtime pour créer une struct tm à partir d'un time_t. Et la tu as un simple champ tm_year accessible.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    ca compile
    Heu, comment dire ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    16:12: warning: assignment to ‘int’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion]
       16 |     result = buffer - anneeNaissance;
    Il est des warnings comme des feux oranges... il y en a qui passent... d'autres qui trépassent.
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Sikarii Voir le message
    Plus simple à dire que à faire, j'ai un mal de chien à comprendre la fonction "time" que tout le monde utilise et même avec la FAQ du C -> Gestion des dates, je n'assimile pas le concept.
    As-tu conscience que (je présume que tu bosses sous Linux) les fonctions de temps travaillent en secondes ? Unix (et son fork Linux) travaille en effet en secondes comptées à partir de sa naissance officielle 1/1/1970 0h00. Donc la fonction time() te retourne le nombre de secondes écoulées depuis cette date au moment où tu l'appelles

    Citation Envoyé par Sikarii Voir le message
    ça compile et tout mais ça me retourne un nombre de secondes pharaonique
    Normal, tu soustrais une année (int) à un tableau de char. Or un tableau contenant (par exemple) {'1', '9', '7', '6'} (ou, si on convertit ça en ascii, {49, 57, 55, 54}) n'est pas vraiment égal au nombre 1976.
    Et comme en C le nom d'un tableau sans crochet équivaut à l'adresse de son premier élément, tu soustrais donc une année à une adresse mémoire.

    Citation Envoyé par Sikarii Voir le message
    Donc ma question c'est comment faire ma différence avec des années et non des secondes?
    Tu convertis la date système en années int et non en années char[]. Ou (autrement dit), tu convertis ce {'1', '9', '7', '6'} en 1976. La fonction strtoul() (ou sa petite soeur atoi()) t'aidera grandement.
    Autre solution mentionnée par Bousk: le champ tm_year de la structure "tm"
    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]

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2019
    Messages : 16
    Points : 57
    Points
    57
    Par défaut
    Merci à tous pour vos réponses d'expert, je vais regarder à ça et je reviendrais vers vous pour vous prévenir si ça fonctionne ou pas ^^

    Bonne continuation à tous

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

Discussions similaires

  1. Gestion approfondie des utilisateurs
    Par Lux interior dans le forum XMLRAD
    Réponses: 11
    Dernier message: 04/03/2003, 21h43
  2. Utilisateurs d'une appli delphi+paradox
    Par Jacques Deyrieux dans le forum Paradox
    Réponses: 2
    Dernier message: 11/12/2002, 18h41
  3. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27
  4. Réponses: 8
    Dernier message: 05/06/2002, 11h55
  5. [Kylix] Sauvegarde de donnée utilisateur....
    Par Eclypse dans le forum EDI
    Réponses: 1
    Dernier message: 11/05/2002, 17h21

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