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 :

Utiliser structure tm dans une autre structure


Sujet :

C

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Points : 40
    Points
    40
    Par défaut Utiliser structure tm dans une autre structure
    Bonjour,
    Je dispose d'une structure vol (caractérisée par un numéro, des villes de départ et de destination, des heures de départ et d'arrivée et une date).

    Je pensais récupérer les heures et la date à partir de la structure tm, parce que je ne vois pas un autre moyen de gérer ça.

    Voici donc 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
     
    #include <stdio.h>
    #include <time.h>
     
    main()
    {
      struct tm {
                // int tm_sec;      // 0 to 59 
                int tm_min;      // 0 to 59
                int tm_hour;     // 0 to 23
                int tm_mday;     // 1 to 31
                int tm_mon;      // 0 to 11 (0=janvier, 11=Ddecembre)
                int tm_year;     // A partir de 1900 (79 équivaut à 1979, 103 équivaut à 2003)
                }; 
     
      struct vol {
                 char num_vol[10];
                 char ville_dep[30];
                 char ville_des[30];
                 struct tm timeinfo;
                 };
     
    struct vol voyage;
    }
    J'essai de manipuler des fichiers pour créer une liste de vols.
    Cela ne marche pas. J'obtiens des chiffres bizarres pour les paramètres de dates et d'heure.

    Pouvez-vous m'aider ?

    Merci

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Regarde comment on déclare une structure en C, je pense que ca t'aidera ...

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonjour,

    Citation Envoyé par Mélodie_et_rythmes Voir le message
    Pouvez-vous m'aider ?
    Sans voir ton code et avec si peu d'infos, ça va être très difficile ! :-)

    Toutefois, sache que lorsque tu déclares une variable, tu ne fais que réserver de l'espace en mémoire. Elle n'est pas initialisée par défaut, car cela a un coût et que la valeur initiale en question n'est pas forcément nulle.

    Cela signifie que les membres de ta structures auront des valeurs indéfinies (correspondant en réalité à l'état de la mémoire au moment où tu les lis) jusqu'à ce que tu les modifies.

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par haleth Voir le message
    Regarde comment on déclare une structure en C, je pense que ca t'aidera ...
    C'est comme ça qu'on m'a appris à les déclarer. Si t'as d'autres suggestions, je suis preneuse.
    Merci.

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour,



    Sans voir ton code et avec si peu d'infos, ça va être très difficile ! :-)

    Toutefois, sache que lorsque tu déclares une variable, tu ne fais que réserver de l'espace en mémoire. Elle n'est pas initialisée par défaut, car cela a un coût et que la valeur initiale en question n'est pas forcément nulle.

    Cela signifie que les membres de ta structures auront des valeurs indéfinies (correspondant en réalité à l'état de la mémoire au moment où tu les lis) jusqu'à ce que tu les modifies.
    Bonjoue

    Sans voir mon code ?
    Pourtant je l'ai inséré ! Il n'est pas visible ?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par Mélodie_et_rythmes Voir le message
    Sans voir mon code ? Pourtant je l'ai inséré ! Il n'est pas visible ?
    Si mais il n'est pas complet, visiblement.

    Tu ne nous présentes que la déclaration de tes deux structures. On ne sait pas de quelle manière tu les emploies par la suite ni ce que utilise pour afficher leur contenu.

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Mélodie_et_rythmes Voir le message
    C'est comme ça qu'on m'a appris à les déclarer. Si t'as d'autres suggestions, je suis preneuse.
    Merci.
    pour reprendre le sujet ta forme de déclaration correspond au C++. En C le nom de la structure se trouve en fin de déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct {
                // int tm_sec;      // 0 to 59 
                int tm_min;      // 0 to 59
                int tm_hour;     // 0 to 23
                int tm_mday;     // 1 to 31
                int tm_mon;      // 0 to 11 (0=janvier, 11=Ddecembre)
                int tm_year;     // A partir de 1900 (79 équivaut à 1979, 103 équivaut à 2003)
                } tm;
    Pour éviter ensuite d'écrire le mot réservé struct à chaque déclaration de variable on définie un nouveau type comme ca (le nom de la définition est totalement arbitraire ici) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct tm tm_t;
    À partir de là tu peux utiliser ta définition pour déclarer une variable :
    Pour finir tu peux concatener tout ceci en écrivant ta déclaration sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct {
                // int tm_sec;      // 0 to 59 
                int tm_min;      // 0 to 59
                int tm_hour;     // 0 to 23
                int tm_mday;     // 1 to 31
                int tm_mon;      // 0 to 11 (0=janvier, 11=Ddecembre)
                int tm_year;     // A partir de 1900 (79 équivaut à 1979, 103 équivaut à 2003)
                } tm_t;
    Son utilisation est comme pour la déclaration précédente.

  8. #8
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Au fait, je suis sous Linux Ubuntu (je en sais pas si ça change quelque chose, mais comme je suis novice en C...).
    J'ai donc l'habitude de toujours déclarer mes structures de cette façon et ça marche.
    Par contre, c'est la première fois que j'ai à faire à la structure tm.

    Merci pour ton astuce concernant la déclaration des struct.

    Pour faire suite à mon code, je souhaite utiliser ce dernier dans le cadre des fichiers. En gros, j'aimerais pouvoir renseigner de nouveaux vols et alimenter un fichier regroupant tous les vols prévus sur une certaine période.

    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
     
    #include <stdio.h>
    #include <time.h>
     
    main()
    {
      struct vol {
                 char num_vol[10];
                 char ville_dep[30];
                 char ville_des[30];
                 struct tm timeinfo;
                 };
     
    struct vol voyage;
    int remplir;
     
    FILE *entree;
     
    /* Ouverture du fichier liste_villes */
      entree = fopen("liste_vols", "a");
     
      if(entree == NULL)
      {
    	printf("Problème d'accès au fichier");
      } 
      else
      {
    		printf("Entrer numéro vol : ");
    		scanf("%s", voyage.num_vol);
    		printf("Entrer ville départ : ");
    		scanf("%s", voyage.ville_dep);
    		printf("Entrer ville destination : ");
    		scanf("%s", voyage.ville_des);
    		printf("Entrer jour : ");
    		scanf("%d", &remplir);
                    voyage.timeinfo.tm_mday = remplir-1;
    		printf("Entrer mois : ");
                    voyage.timeinfo.tm_mon = remplir-1;
    		scanf("%d", &remplir);
    		printf("Entrer année : ");
    		scanf("%d", &remplir);
                    voyage.timeinfo.tm_year = remplir-1900;
     
    		fprintf(entree, "%s %s %s %d %d %d \n", voyage.num_vol, voyage.ville_dep, voyage.ville_des, &voyage.timeinfo.tm_mday, &voyage.timeinfo.tm_mon, &voyage.timeinfo.tm_year, &voyage.prix_base, &voyage.type_avion);
      }
    fclose(entree);
    }
    C'est dans ce sens que je disais que ça ne marchait pas, puisque pour les heures et les dates j'obtiens de longs chiffres qui ne veulent rien dire .

  9. #9
    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
    - Dans un scanf() il faut spécifier on veut mettre la donnée et c'est pourquoi l'argument doit être une adresse comme ici dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    scanf("%s", voyage.num_vol);
    //ou
    scanf("%d", &voyage.timeinfo.tm_mday);
    (voyage.num_vol est un tableau donc dans ce contexte représente l'adresse du premier élément du tableau)

    - Par contre, dans un printf(), l'argument est la quantité à afficher. On spécifie donc directement la valeur, pas son adresse (sauf si c'est une chaine, (%s), où on spécifie l'adresse du début de la chaine).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(entree, "%d", voyage.timeinfo.tm_mday);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  10. #10
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par diogene Voir le message
    - Dans un scanf() il faut spécifier on veut mettre la donnée et c'est pourquoi l'argument doit être une adresse comme ici dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    scanf("%s", voyage.num_vol);
    //ou
    scanf("%d", &voyage.timeinfo.tm_mday);
    (voyage.num_vol est un tableau donc dans ce contexte représente l'adresse du premier élément du tableau)

    - Par contre, dans un printf(), l'argument est la quantité à afficher. On spécifie donc directement la valeur, pas son adresse (sauf si c'est une chaine, (%s), où on spécifie l'adresse du début de la chaine).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(entree, "%d", voyage.timeinfo.tm_mday);
    Bien vu Merci Diogene !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/04/2012, 16h40
  2. [JNA] - Pointeur de structure dans une autre structure
    Par John.BE dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 24/02/2012, 15h02
  3. Réponses: 2
    Dernier message: 14/02/2011, 15h56
  4. Structures complexes dans une autre structure?
    Par cata2 dans le forum MATLAB
    Réponses: 4
    Dernier message: 19/09/2007, 23h05
  5. Réponses: 1
    Dernier message: 24/03/2007, 18h50

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