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 :

structure en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut structure en C
    Bonjour,
    J'ai codé le programme suivant qui saisie 5 produits et les affiche. J'ai un problème avec les deux fonctions de saisie et d'affichage : il ne fonctionne pas. SVP aidez-moi à trouver mes fautes et merci d'avance.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    struct Produit
    {
        char nom[40];
        float prix;
    };
    void SaisieStock(struct Produit stock[], int n)
    {
        int i;
        for(i=0; i<n; i++)
        {
            //printf("Produit numéro %d : \n",i);
            scanf("nom : %s",&stock[i].nom);
            scanf("prix : %f",&stock[i].prix);
        }
    }
     
    void affiche_Stock (struct Produit stock[], int n)
    {
        int i;
        printf("Les produits sont :\n");
        for(i=0; i<n; i++)
        {
            printf("Produit %d : \n",i);
            printf("nom : %s \n",&stock[i].nom);
            printf("prix : %f \n",&stock[i].prix);
        }
    }
     
    int main()
    {
        struct Produit stock[5];
        SaisieStock(stock,5);
        affiche_Stock(stock,5);
     
        system("PAUSE");
        return 0;
    }

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SaisieStock(struct Produit stock[], int n)
    Tu transmets à cette fonction, ainsi qu'à celle pour l'affichage, une copie de ton tableau. Il faut lui transmettre l'adresse en lieu et place si tu veux pouvoir récupérer dans ton main(); les informations saisies.

  3. #3
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    Merci pour la réponse.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    struct Produit
    {
           char nom[40];      
           float prix;
    };
          void SaisieStock(struct Produit* stock[], int n)
          {    
               int i;
               for(i=0;i<n;i++)
               {
                    printf("Produit numéro %d : \n",i);    
                    printf("nom : ");       
                    scanf("%s",&stock[i]->nom);  
                    printf("prix : ");
                    scanf("%f",&stock[i]->prix);
               }
           }
     
     
     
    int main()
    {
        struct Produit* stock[3];
        SaisieStock(stock,3);
     
     
      system("PAUSE");	
      return 0;
    }
    A l'exécution, juste après la saisie du nom du premier produit ,le message suivant s'affiche "Le programme a cessé de fonctionner"

  4. #4
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    Merci pour la rapidité de la réponse.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    struct Produit
    {
           char nom[40];      
           float prix;
    };
          void SaisieStock(struct Produit* stock[], int n)
          {    
               int i;
               for(i=0;i<n;i++)
               {
                    printf("Produit numéro %d : \n",i);    
                    printf("nom : ");       
                    scanf("%s",&stock[i]->nom);  
                    printf("prix : ");
                    scanf("%f",&stock[i]->prix);
               }
           }
     
     
     
    int main()
    {
        struct Produit* stock[3];
        SaisieStock(stock,3);
     
     
      system("PAUSE");	
      return 0;
    }
    A l'exécution, juste après la saisie du nom du premier produit ,le message suivant s'affiche "Le programme a cessé de fonctionner"

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    J'ai l'impression que tu ne maitrise pas totalement les pointeurs. Bon, c'est vrai, le sujet n'est pas forcément facilement assimilable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SaisieStock(struct Produit* stock[], int n)
    Tu récupères ici l'adresse de l'adresse de ton tableau. Ce n'est pas ce que tu recherches. Pour t'aider un peu les[*] sont de trop .

  6. #6
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    Oui c'st vrai, j'ai un problème avec les pointeurs. Mais maintenant j'ai un problème plus difficile : j'ai besoin de cet exercice dans une demi heure et je vois pas encore comment le corriger .

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SaisieStock(struct Produit stock[], int n)
    Tu transmets à cette fonction, ainsi qu'à celle pour l'affichage, une copie de ton tableau. Il faut lui transmettre l'adresse en lieu et place si tu veux pouvoir récupérer dans ton main(); les informations saisies.
    Je ne suis pas sûr de comprendre cette phrase. C'est bien le tableau qui est passé (ou plus exactement l'adresse de son premier élément).

    Il y a surtout un problème avec cette ligne qui émet un warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("nom : %s \n",&stock[i].nom);
    Je pense que le & est en trop.
    Il y a le même problème avec les printf(), les & sont en trop.

    En les enlevant, le premier code semble fonctionner correctement.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je ne suis pas sûr de comprendre cette phrase. C'est bien le tableau qui est passé (ou plus exactement l'adresse de son premier élément).

    Il y a surtout un problème avec cette ligne qui émet un warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("nom : %s \n",&stock[i].nom);
    Je pense que le & est en trop.
    Il y a le même problème avec les printf(), les & sont en trop.

    En les enlevant, le premier code semble fonctionner correctement.
    Trop tôt pour moi ce matin .

    Toutes mes excuses pour cette explication qui n'en est pas une . Pour la peine je plussoie aussi Bktero qui a relevé cette erreur impardonnable. J'ai bien mérite une

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SaisieStock(struct Produit stock[], int n)
    Tu transmets à cette fonction, ainsi qu'à celle pour l'affichage, une copie de ton tableau. Il faut lui transmettre l'adresse en lieu et place si tu veux pouvoir récupérer dans ton main(); les informations saisies.
    Je plussoie Bktero, en C, les tableaux ne sont pas passé par copie mais par adresse.
    Le tableau est implicitement convertit en un pointeur sur son premier élément.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    void foo(int tab[])
    {
            tab[0] = 5;
    }
     
    int main(void)
    {
            int tab[1] = {4};
            foo(tab);
            printf("%d\n", tab[0]);
            return 0;
    }
    Affiche 5 et non 4.

Discussions similaires

  1. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  2. [tables systèmes] extraction de la structure d'une base
    Par laffreuxthomas dans le forum Autres SGBD
    Réponses: 6
    Dernier message: 23/03/2006, 13h24
  3. [VB6] [Fichier] Enregistrer des variables de structure
    Par de.bo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/10/2002, 11h09
  4. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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