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 :

Fonction, structure, pointeurs et scanf


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut Fonction, structure, pointeurs et scanf
    Bonjour,

    Bon voilà je commence à peine à toucher au structures et aux pointeurs sur des structures. et donc j'ai fait un petit exo pour essayer d'aplliquer ce que j'ai appris.

    Mais en compilant le code suivant j'ai des erreurs au niveau de la fonction de saisie

    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    F:\Documents and Settings\DonExhortae\Mes documents\ListesChainees\ex_1bis\main.c:16: error: two or more data types in declaration of `saisieClient'
    F:\Documents and Settings\DonExhortae\Mes documents\ListesChainees\ex_1bis\main.c:19: error: request for member `nom' in something not a structure or union
    F:\Documents and Settings\DonExhortae\Mes documents\ListesChainees\ex_1bis\main.c:21: error: request for member `prenom' in something not a structure or union
    F:\Documents and Settings\DonExhortae\Mes documents\ListesChainees\ex_1bis\main.c:23: error: request for member `adresse' in something not a structure or union
    F:\Documents and Settings\DonExhortae\Mes documents\ListesChainees\ex_1bis\main.c:25: error: request for member `numeroDeCompte' in something not a structure or union
    F:\Documents and Settings\DonExhortae\Mes documents\ListesChainees\ex_1bis\main.c:27: error: request for member `solde' in something not a structure or union
    :: === Build finished: 6 errors, 0 warnings ===

    voilà 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct Client Client;
     
    struct Client
    {
        char nom[20];
        char prenom[20];
        char adresse[20];
        int numeroDeCompte;
        float solde;
    }
     
    void saisieClient (Client *p, int i)
    {
        printf("\n\n\n\t\t\tClient N° %d\n\n", i + 1);
        printf ("Nom : ");
        scanf ("%s", p.nom);
        printf ("Prenom : ");
        scanf ("%s", p.prenom);
        printf ("Adresse : ");
        scanf ("%s", p.adresse);
        printf ("Numero de compte : ");
        scanf ("%d", p.numeroDeCompte);
        printf ("Solde : ");
        scanf ("%f", p.solde);
    }
     
    void affichageCLient (Client *p, int i)
    {
        printf ("\n\n\n\t\t\tCLient N° %d\n\n)", i + 1);
        printf ("Nom : %s\n", p->nom);
        printf ("Prenom : %s\n", p->prenom);
        printf ("Adresse : %s\n", p->adresse);
        printf ("Numero de compte : %d\n", p->numeroDeCompte);
        printf ("Solde : %.2f\n", p->solde);
        system ("pause");
    }
     
    int main (void)
    {
        int nombreClients;
        int i;
        Client *t;
     
        printf ("Entrez le nombre de clients a saisir : ");
        scanf ("%d", &nombreClients);
     
        /* Allocation memoire */
        t = malloc (nombreClients * sizeof (Client));
     
        if (t == NULL)
        {
            printf ("Probleme d'allocation memoire");
            system ("pause");
            exit (EXIT_FAILURE);
        }
        else
        {
            /* Saisie */
            for (i = 0; i < nombreClients; i++)
            {
                saisieClient ((t + i), i);
            }
     
            /* Affichage */
            for (i = 0; i < nombreClients; i++)
            {
                affichageCLient ((t + i), i);
            }
     
            free (t);
        }
     
        return 0;
    }
    si quelqu'un pouvait m'expliquer ce qui cloche , merci

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Quelques corrections (en gras) suivant tes messages:
    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 Client
    {
        char nom[20];
        char prenom[20];
        char adresse[20];
        int numeroDeCompte;
        float solde;
    };
    
    void saisieClient (Client *p, int i)
    {
        printf("\n\n\n\t\t\tClient N° %d\n\n", i + 1);
        printf ("Nom : ");
        scanf ("%s", p->nom);
        printf ("Prenom : ");
        scanf ("%s", p->prenom);
        printf ("Adresse : ");
        scanf ("%s", p->adresse);
        printf ("Numero de compte : ");
        scanf ("%d", p->numeroDeCompte);
        printf ("Solde : ");
        scanf ("%f", p->solde);
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Franck.H
    Quelques corrections (en gras) suivant tes messages:
    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
    void saisieClient (Client *p, int i)
    {
        printf("\n\n\n\t\t\tClient N° %d\n\n", i + 1);
        printf ("Nom : ");
        scanf ("%s", p->nom);
        printf ("Prenom : ");
        scanf ("%s", p->prenom);
        printf ("Adresse : ");
        scanf ("%s", p->adresse);
        printf ("Numero de compte : ");
        scanf ("%d", p->numeroDeCompte);
        printf ("Solde : ");
        scanf ("%f", p->solde);
    }
    Je dois dire que là je ne comprends pas, je pensais que p->quelquechose était équivalent à (*p).quelquechose, pourtant dans ma fonction saisieClient le scanf s'attend à ce que je lui donne une adresse (un pointeur), alors pourquoi lui passer une valeur.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par exhortae
    Je dois dire que là je ne comprends pas, je pensais que p->quelquechose était équivalent à (*p).quelquechose, pourtant dans ma fonction saisieClient le scanf s'attend à ce que je lui donne une adresse (un pointeur), alors pourquoi lui passer une valeur.
    scanf attend une adresse, non un pointeur, nuance ... Juste une correction pour les deux derniers scanf, j'avais pas fait attention:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void saisieClient (Client *p, int i)
    {
        printf("\n\n\n\t\t\tClient N° %d\n\n", i + 1);
        printf ("Nom : ");
        scanf ("%s", p->nom);
        printf ("Prenom : ");
        scanf ("%s", p->prenom);
        printf ("Adresse : ");
        scanf ("%s", p->adresse);
        printf ("Numero de compte : ");
        scanf ("%d", & p->numeroDeCompte);
        printf ("Solde : ");
        scanf ("%f", & p->solde);
    }
    L'argument p de ta fonction est un pointeur et donc, il faut utiliser l'opérateur ->. Tu peux utiliser . dans la condition suivante (exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf ("%s", (*p).nom);
    Toi avant tu faisait:
    alors que p est un pointeur, d'où tes erreurs !


    Suivant le type de p ces instructions ont le même effet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Client p;
    scanf ("%s", p.nom);
     
    Client *p;
    ...
    scanf ("%s", p->nom);
    Pourquoi ? Bin parce que nom est un tableau donc dans ces deux cas précis, tu ne fait que transmettre l'adresse du premier élément du tableau nom, rien de plus et rien de moins.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Bon si je comprends bien je n'ai pas droit de faire p.solde, parceque p est un pointeur.

    si je veux faire ça il faut que je fasse d'abord (*p).solde ou p->solde et ensuite que j'indique que c'est l'adresse que je veux passer comme paramètre à scanf

    donc p.solde est faux, c'est &p->solde qui est correct, c'est bien ça???

    une dernière question

    est-ce que &(p->solde) c'est la même chose que &p->solde ?


    merci

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par exhortae
    Bon si je comprends bien je n'ai pas droit de faire p.solde, parceque p est un pointeur.

    si je veux faire ça il faut que je fasse d'abord (*p).solde ou p->solde et ensuite que j'indique que c'est l'adresse que je veux passer comme paramètre à scanf

    donc p.solde est faux, c'est &p->solde qui est correct, c'est bien ça???
    Oui, tu utilises & si le type dont tu transmet l'adresse est une simple variable comme celle-ci.

    Citation Envoyé par exhortae
    est-ce que &(p->solde) c'est la même chose que &p->solde ?
    Oui
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Franck.H
    Oui, tu utilises & si le type dont tu transmet l'adresse est une simple variable comme celle-ci.


    Oui
    merci

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    scanf("%s") est l'une des deux pires utilisations de scanf(). Spécifier une limite dans le format ou utiliser fgets() à la place.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Médinoc
    scanf("%s") est l'une des deux pires utilisations de scanf(). Spécifier une limite dans le format ou utiliser fgets() à la place.

    Oui, je le sait , le soucis c'est qu'en cours c'est ce que le prof utilise , on m'a montrer l'utilisation correct de fgets, mais ça me donne du code trop different de celui attendu par le prof , j'attends les vacances d'été pour pouvoir corriger tout ça tranquilement (j'ai le k&r, il me faut juste du temps pour bosser ça à fond) , et enlever de ma tête certains des trucs tordus qu'on nous apprend en classe

    Merci

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Citation Envoyé par exhortae
    le soucis c'est qu'en cours c'est ce que le prof utilise
    Eh oui, c'est l'autre des deux pires utilisations de scanf() : L'enseigner à des débutants.
    Tu utilises fgets() et tu bashes le prof pour son incompétence et/ou son irresponsabilité...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par exhortae
    Mais en compilant le code suivant j'ai des erreurs au niveau de la fonction de saisie
    Petite stratégie de mise au point :
    1 - quand il y a une liste d'erreurs, ne s'intéresser qu'à la première.
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    <...>\ex_1bis\main.c:16: error: two or more data types in declaration of `saisieClient'
    2 - 9 fois sur 10, c'est une structure qui a été définie juste avant la fonction, mais sans ;
    voilà mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct Client
    {
    }
     
    void saisieClient (Client *p, int i)
    {
    <...>
    }
    3 - Et voilà.

    La fonction ne peut pas avoir plus d'un type. C'est void.

    Nota. Si on avait omis le void, la compilation se serait passée sans histoires, mais la fonction aurait voulu retourner une structure (de taille non négligeable), ce qui aurait ajouter du code et du temps d'exécution pour rien...

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par exhortae
    et enlever de ma tête certains des trucs tordus qu'on nous apprend en classe
    Par curiosité professionnelle, tu es en classe où ?

  13. #13
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Petite stratégie de mise au point :
    1 - quand il y a une liste d'erreurs, ne s'intéresser qu'à la première.
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    <...>\ex_1bis\main.c:16: error: two or more data types in declaration of `saisieClient'
    2 - 9 fois sur 10, c'est une structure qui a été définie juste avant la fonction, mais sans ;

    3 - Et voilà.

    La fonction ne peut pas avoir plus d'un type. C'est void.

    Nota. Si on avait omis le void, la compilation se serait passée sans histoires, mais la fonction aurait voulu retourner une structure (de taille non négligeable), ce qui aurait ajouter du code et du temps d'exécution pour rien...
    j'avais pas compris l'erreur sur le compilo, et je m'étais arraché la tête avant Franck ne me la fasse remarquée, je sais maintenant pourquoi le compilo mettait cette erreur

  14. #14
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Par curiosité professionnelle, tu es en classe où ?

    répondu en MP

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

Discussions similaires

  1. structure / pointeur sur fonction
    Par fd_caramba dans le forum Débuter
    Réponses: 4
    Dernier message: 28/09/2008, 18h06
  2. Probléme structure pointeur fonction
    Par babouoles dans le forum Bibliothèque standard
    Réponses: 9
    Dernier message: 14/05/2008, 17h34
  3. paramètres fonction structures pointeurs
    Par tom31 dans le forum Débuter
    Réponses: 2
    Dernier message: 12/01/2008, 18h22
  4. Réponses: 10
    Dernier message: 04/01/2006, 16h57
  5. Structure, pointeur et fonction...
    Par Linaa dans le forum C
    Réponses: 15
    Dernier message: 04/12/2005, 13h12

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