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 :

explications de code


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut explications de code
    bonjour,

    je suis débutant en prog C/C++ et j'aimerai savoir si quelqu'un pouvait m'expliquer en détails (avec des mots que je puisse comprendre lol ) le code suivant (mot par mot si quelqu'un a assez de patience) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
        time_t     now = time(0);
        struct tm  tstruct;
        char       buf[80];
        tstruct = *localtime(&now);
     
        strftime(buf, sizeof(buf), "%X", &tstruct);
     
        return buf;
    }

    D'avance, merci.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Des maladresses et une erreur fatale.
    Pour plus de détails, consulter la documentation des différentes fonctions utilisées

    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
       time_t     now = time(0); 
    // La fonction time() retourne la date et l'heure courante dans un format de type time_t (un type arithmétique adéquat). 
    // Son argument est un pointeur, ici le pointeur NULL. Il aurait été préférable de le souligner :
    // time_t     now = time(NULL);
        struct tm  tstruct;
    // Création d'une structure tm pouvant contenir la date et l'heure sous un format plus accessible grace à ses 
    // différents champs (année, mois, jour du mois, heure, minutes, secondes,...) 
        char       buf[80];
    // création d'un tableau de 80 char
        tstruct = *localtime(&now);
    // localtime() convertit une donnée de date&heure du format time_t en un format struct tm. La donnée de format time_t 
    // à convertir (now) doit être communiquée à la fonction via son adresse (d'où l'argument &now).
    // Elle renvoie l'adresse d'une variable statique de type struct tm contenant les informations (ou NULL en cas d'échec)
    // Cette variable statique est obtenue en prenant le contenu de l'adresse renvoyée (espérons qu'elle n'est pas NULL) par
    // *localtime(&now) et copiée dans la structure tm tstruct (ce qui est d'ailleurs inutile)
        strftime(buf, sizeof(buf), "%X", &tstruct);
    // transforme le contenu de la structure tstruct, dont l'adresse est passée en argument (&tstruct) en une chaine 
    // de caractères exprimant la date et l'heure suivant  le format "%X" (voir la doc de la fonction pour les détails 
    // sur ce format) et la place dans le tableau buf.
    // Mais pourquoi avoir créé tstruct pour ça alors qu'il suffisait pour faire la même chose de 
    // strftime(buf, sizeof(buf), "%X", localtime(&now));
       return buf;
    // ERREUR fatale :On ne doit jamais retourner l'adresse d'une variable locale puisque cette variable est détruite
    // en sortant de son bloc de définition et que cette adresse ne signifie alors plus rien. 
    // Or buf est, dans ce contexte, l'adresse du premier élément du tableau local buf[] défini dans ce bloc.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nyxemis Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
        time_t     now = time(0);
        struct tm  tstruct;
        char       buf[80];
        tstruct = *localtime(&now);
     
        strftime(buf, sizeof(buf), "%X", &tstruct);
     
        return buf;
    }
    Citation Envoyé par diogene Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       return buf;
    // ERREUR fatale :On ne doit jamais retourner l'adresse d'une variable locale puisque cette variable est détruite
    // en sortant de son bloc de définition et que cette adresse ne signifie alors plus rien. 
    // Or buf est, dans ce contexte, l'adresse du premier élément du tableau local buf[] défini dans ce bloc.
    Bonjour

    On peut arranger ce dernier détail

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
        time_t     now = time(NULL);
        struct tm  tstruct;
        char       *buf;
        tstruct = *localtime(&now);
     
        buf=malloc(80 * sizeof(char));
        if (buf == NULL) return NULL;
     
        strftime(buf, sizeof(buf), "%X", &tstruct);
     
        return buf;
    }
    La différence avec le code précédent, c'est que maintenant, buf contient l'adresse d'une zone mémoire allouée de façon explicite, et qui ne se trouve pas dans la zone mémoire appelée "pile" mais "tas" et donc qui ne sera pas détruite automatiquement en fin de fonction.
    Donc l'adresse de cette zone persistante est récupérée par l'appelant qui peut s'en servir comme il l'entend. Toutefois ce sera à lui de s'assurer que la zone est libérée via un free() lorsqu'il n'en aura plus besoin.
    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]

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Et bien merci beaucoup pour la correction et les explications
    Est ce que quelqu'un saurait répondre a ma question initiale svp ?

    D'avance, merci beaucoup !

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Nyxemis Voir le message
    Est ce que qqun saurait repondre a ma question initiale svp ?
    Heu ... là, je ne comprends plus.

    La réponse de diogene a été plus que complète et surtout détaillé et pédagogique. Maintenant, c'est aussi à toi de faire un effort pour comprendre ce qui a été dit.

    Prends un bon livre sur le C, relis tes cours de programmation, regarde les différents tutoriels mais je vois difficilement ce que l'on peut faire de plus.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par Nyxemis Voir le message
    Et bien merci beaucoup pour la correction et les explications
    Est ce que quelqu'un saurait répondre a ma question initiale svp ?
    Les commentaires — en gris — insérés dans le code de Diogène sont les explications que tu recherches. Si ça ne suffit pas, dis-nous sur quels points en particulier tu butes.

  7. #7
    Membre régulier Avatar de Mipwiq
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 42
    Points : 81
    Points
    81
    Par défaut
    Les explications de Diogène sont très détaillées. Je suis sûr que même un débutant comme toi peut les comprendre.

    Si tu as un problème en particulier avec une ligne ou une fonction dit nous précisément ce qui te dérange.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    oups ! Désolé... j'étais sur le téléphone quand j'ai répondu, et je n'avais pas tout vu. Effectivement, la réponse est très complète et je t'en remercie diogene !!!


    Merci de votre participation a mon apprentissage !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    On peut arranger ce dernier détail

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
        time_t     now = time(NULL);
        struct tm  tstruct;
        char       *buf;
        tstruct = *localtime(&now);
     
        buf=malloc(80 * sizeof(char));
        if (buf == NULL) return NULL;
     
        strftime(buf, sizeof(buf), "%X", &tstruct);
     
        return buf;
    }
    La différence avec le code précédent, c'est que maintenant, buf contient l'adresse d'une zone mémoire allouée de façon explicite, et qui ne se trouve pas dans la zone mémoire appelée "pile" mais "tas" et donc qui ne sera pas détruite automatiquement en fin de fonction.
    Donc l'adresse de cette zone persistante est récupérée par l'appelant qui peut s'en servir comme il l'entend. Toutefois ce sera à lui de s'assurer que la zone est libérée via un free() lorsqu'il n'en aura plus besoin.

    j'ai essayer ton code, et voici l'erreur qui en ressort...

    In function 'const string currentDateTime()'
    error: invalid conversion from 'void*' to 'char*' [-fpermissive]|
    ||=== Build finished: 1 errors, 0 warnings (0 minutes, 1 seconds) ===|

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu ne compilerais pas en mode C++ toi ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    effectivement, tu as raison

  12. #12
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ce code est faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        char       *buf;
    ...
        buf=malloc(80 * sizeof(char));
        if (buf == NULL) return NULL;
        strftime(buf, sizeof(buf), "%X", &tstruct);
    buf est un pointeur et sizeof (buf) donnera la taille d'un pointeur, pas du tout la taille de la zone allouée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        buf=malloc(80);
        if (buf != NULL) strftime(buf, 80, "%X", &tstruct);
        return buf;
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  13. #13
    Membre régulier Avatar de Mipwiq
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 42
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par diogene Voir le message
    buf est un pointeur et sizeof (buf) donnera la taille d'un pointeur, pas du tout la taille de la zone allouée.
    Dans ce cas là, si il doit y avoir utilisation de sizeof, pour avoir la taille il faudrait faire je trouve plus compréhensible de présenter la chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        char       *buf;
        int          size = (80 * sizeof(*buf));
     
        buf = malloc(size);
        if (buf == NULL) return NULL;
        strftime(buf, size, "%X", &tstruct);
        return buf;

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        char       *buf;
    ...
        buf=malloc(80 * sizeof(char));
        if (buf == NULL) return NULL;
        strftime(buf, sizeof(buf), "%X", &tstruct);
    buf est un pointeur et sizeof (buf) donnera la taille d'un pointeur, pas du tout la taille de la zone allouée.
    Exact, erreur d'inattention de ma part.

    Citation Envoyé par diogene Voir le message
    Ce code est faux
    Mouais. Je pense que tu aurais pu modérer un peu ton expression.

    Citation Envoyé par Mipwiq Voir le message
    Dans ce cas là, si il doit y avoir utilisation de sizeof, pour avoir la taille il faudrait faire je trouve plus compréhensible de présenter la chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        char       *buf;
        int          size = (80 * sizeof(*buf));
     
        buf = malloc(size);
        if (buf == NULL) return NULL;
        strftime(buf, size, "%X", &tstruct);
        return buf;
    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]

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    comment devrais je faire si je voudrai demander d’écrire une heure au format hh:mm:ss ? Le but etant d'en demander plusieurs et de les enregistrer...


    ps: tu a vraiment assurer pour l'explication que je viens une nouvelle fois de regarder ! Merci encore !!!

  16. #16
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Et pourqoui pas ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    time_t curtime;
    struct tm *ti;
    char tmp[50];
     
    curtime=time(NULL);
    ti=localtime(&curtime);
    sprintf(tmp,"%02d:%02d:%02d %02d/%02d/%04d\n",ti->tm_hour,ti->tm_min,ti->tm_sec,ti->tm_mday,ti->tm_mon+1,ti->tm_year+1900);
    Qui place dans tmp une chaine de caractère du style "01:42:02 31.07.2013"
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

Discussions similaires

  1. Explication de code
    Par sacco dans le forum C
    Réponses: 2
    Dernier message: 12/04/2006, 23h13
  2. Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 1
    Dernier message: 20/03/2006, 09h58
  3. Shell - Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 13
    Dernier message: 13/01/2006, 16h03
  4. Explication de code - RE
    Par deedoo dans le forum Général Python
    Réponses: 23
    Dernier message: 29/07/2005, 14h00
  5. Explication de code simple
    Par Clad3 dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/03/2005, 11h31

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