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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 48
    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 : 48
    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 : 48
    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
    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...

  8. #8
    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

+ 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