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 :

probleme avec les structures et pointeurs


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 9
    Points
    9
    Par défaut probleme avec les structures et pointeurs
    bonjour, j'ai un devoir à faire en c pour apprendre à utiliser les structures, le but de cette exercice est de comparer 2 temps hh/mn/ss, j'arrive a saisir un temps en utilisant la fonction entree() mais je ne sais pas comment garder en mémoire le premier temps saisi en T1 puis de saisir un deuxième temps en T2 afin de les comparer par la suite dans une fonction diff(t1,t2)

    voila le code que j'ai crée:

    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
     
    struct temps
                { int heures;
                  int minutes;
                  int secondes;
                };
     
    entree()
    {
    struct temps e;
    printf("entrez heure  minutes  secondes ");
    scanf("%d %d %d",&e.heures,&e.minutes,&e.secondes);
    }
     
    main()
    {
    entree();/*utilisé pour t1*/
    entree();/*utilisé pour t2*/
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Alors tout simplement il faudrait que tu passes un pointeur sur ta structure à remplir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    entree(struct temps *e)
    {
    printf("entrez heure  minutes  secondes ");
    scanf("%d %d %d", &e->heures, &e->minutes, &e->secondes);
    }
     
    main()
    {
    struct temps s1, s2;
    entree(&s1);/*utilisé pour t1*/
    entree(&s2);/*utilisé pour t2*/
    }
    Je voudrais aussi rajouter que le prototype de main n'est pas conforme

    int main(void)
    ou
    int main(int argc, char **argv)

    Ensuite ta fonction de saisie n'est pas très sécurisé (que se passe t-il si l'utilisateur entre une lettre à la place d'un chiffre ?).
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Salut

    Premièrement, pense à utiliser la balise CODE pour présenter ton code, ce sera bien plus clair

    Ensuite pour ton exercice : il faut stocker le résultat de la saisie dans une structure déclarée dans ta fonction main. Tu as 2 possibilités :

    - Soit ta fonction retourne une structure qui sera copiée dans la variable.
    - Soit ta fonction modifie directement la variable via un pointeur.

    En gros :

    1er cas :
    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
    struct temps
    entree (void)
    {
        struct temps e = {0};
     
        /* Ton traitement ici */
     
        return e;
    }
     
    int
    main (void)
    {
        struct temps t1 = {0};
        struct temps t2 = {0};
     
        t1 = entree ();
        t2 = entree ();
     
        return 0;
    }
    2ème cas :
    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
    void
    entree (struct temps *e)
    {
        /* Traitement (n'oublie pas que c'est un pointeur de structure
         * => Utilisation du -> pour affecter une valeur) */
    }
     
    int
    main (void)
    {
        struct temps t1 = {0};
        struct temps t2 = {0};
     
        entree (&t1);
        entree (&t2);
     
        return 0;
    }
    Voilà

  4. #4
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par dicovid
    bonjour, j'ai un devoir à faire en c pour apprendre à utiliser les structures, le but de cette exercice est de comparer 2 temps hh/mn/ss, j'arrive a saisir un temps en utilisant la fonction entree() mais je ne sais pas comment garder en mémoire le premier temps saisi en T1 puis de saisir un deuxième temps en T2 afin de les comparer par la suite dans une fonction diff(t1,t2)

    voila le code que j'ai crée:

    struct temps
    { int heures;
    int minutes;
    int secondes;
    };

    entree()
    {
    struct temps e;
    printf("entrez heure minutes secondes ");
    scanf("%d %d %d",&e.heures,&e.minutes,&e.secondes);
    }

    main()
    {
    entree();/*utilisé pour t1*/
    entree();/*utilisé pour t2*/

    }
    Il faut pouvoir soit renvoyer une copie de la structure créée par la fonction entree, soit utiliser les pointeurs (c'est mieux).

    Exples :


    Par copie en retour,
    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
    #include <stdio.h>
     
    struct temps { 
       int heures;
       int minutes;
       int secondes;
    };
     
    struct temps entree(void)
    {
        struct temps e;
        printf("entrez heure  minutes  secondes ");
        scanf("%d %d %d",&e.heures,&e.minutes,&e.secondes);
        return e;
    }
     
    int main(void)
    {
       struct temps t1, t2;
       t1 = entree();   
       t2 = entree();
     
       /* traitement ici */   
     
       return 0;
    }
    Par copie en retour,
    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
    #include <stdio.h>
     
    struct temps { 
       int heures;
       int minutes;
       int secondes;
    };
     
    void entree(struct temps * t)
    {
        if (t) {
           printf("entrez heure  minutes  secondes ");
           scanf("%d %d %d",t->heures,t->minutes,t->secondes);
           return e;
        }
    }
     
    int main(void)
    {
       struct temps t1, t2;
       /* t1 et t2 en In-Out sont mis à jour par la fonction entree() */
       entree(&t1);   
       entree(&t2);
     
       /* traitement ici */   
     
       return 0;
    }
    La deuxième solution est à privilégier car dans le cadre de grosses structures, il est beaucoup plus couteux de copier le contenu effectif de la structure que son adresse en mémoire (le pointeur, qui est aussi une variable comme une autre et qui est aussi copiée dans le second cas, il n'y a que des passages de paramètres par copie en C).

    A+

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 9
    Points
    9
    Par défaut résolu
    merci c'est gentil d'avoir répondu si vite, je pense avoir compris le fonctionnement des structures, en fait je ne savais pas ou utiliser les pointeurs, maintenant c bon.

    merci encore.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 79
    Points
    79
    Par défaut
    Si tu ne déclare pas deux heures différentes au sein de ton main, je ne vois pas comment tu pourrais allouer deus heures différentes. Renseigne toi sur le passage de variable en paramètre dans une fonction.
    Pas du tout vérifier les modifs, mais ca doit plutot etre un truc du genre.

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par zicos
    renseigne toi sur le passage de variable en paramètre dans une fonction.
    Pas du tout vérifier les modifs, mais ca doit plutot etre un truc du genre.

    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
    struct temps
                { int heures;
                  int minutes;
                  int secondes;
                };
     
    entree(temps e)
    {
     
    printf("entrez heure  minutes  secondes ");
    scanf("%d %d %d",&e.heures,&e.minutes,&e.secondes);
    }
     
    main()
    {
    temps t1,t2;
    // ou plutôt 
     
     
    entree(&t1);/*utilisé pour t1*/
    entree(&t2);/*utilisé pour t2*/
     
    }
    Ton code est faux. Tu n'a pas (ou p-e oublié) modifié le prototype de la fonction. Et en plus tu accedes a tes membres de structure comme si c'était une structure normale.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

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

Discussions similaires

  1. probleme avec les structures
    Par stratus65 dans le forum C
    Réponses: 1
    Dernier message: 03/03/2011, 15h01
  2. probleme avec les structures
    Par sourir-d'enfer dans le forum Débuter
    Réponses: 4
    Dernier message: 10/01/2010, 17h01
  3. Probleme avec les structures
    Par hidies dans le forum MATLAB
    Réponses: 5
    Dernier message: 16/05/2007, 16h41
  4. [Débutant] Probleme avec les pointeurs
    Par amira dans le forum C
    Réponses: 14
    Dernier message: 04/12/2006, 14h27
  5. probleme avec les structures
    Par salif98 dans le forum C
    Réponses: 3
    Dernier message: 27/08/2006, 01h30

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