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 :

données erroné dans liste chainée


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 20
    Par défaut données erroné dans liste chainée
    Bonjour,
    voilà je dois faire une liste chainée d'achat qui liste les achats d'un client et les produits achetés. j'ai trois structure : une produit, une client et une element(achat) c'est le node.
    bon voilà quand je crée un client que je veux entrer dans mon tableau ce que j'ai initialisé est erroné. cela vient surement de mes pointeurs. j'aimerais un petit coup de main pour m'aider à pouvoir des clients dans mon tableau de client. premierement
    voila mon code merci
    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
     
    typedef struct element {
    int dateAchat;
    int quantite;
    struct element *ptrElementVert;
    struct element *ptrElementHori;
     
    }ELEMENT;
     
    typedef struct client {
    char* nomClient;
    char* prenomClient;
    struct element *ptrElementCli;
     
    }CLIENT;
    je passe les prototypes et qques fonctions
    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
     
     
    int main (int argc, char* argv[])
    {
     
      CLIENT tabClient[10];
      PRODUIT tabProduit[10];
    // compteur et indice tableau
    int cptClient=0;
    int cptProduit=0;
     
     
    CLIENT* tmp=NULL;
     
    do
    {
        select = menu();
        switch (select)
            {
            case 1:
                    //CLIENT cl;
                    tmp = malloc(sizeof(CLIENT));
                    addClient2(&cptClient, tmp);
                     printf("%s", tmp->nomClient);
                    tabClient[0]=*tmp;
                    printf("%s", tabClient[0].nomClient);
                    break;
     
            case 2: ; break;
            case 3: ; break;
            case 4: ; break;
            case 5: end = quit(); break;
            default: message("\n\nPlease make a selection between 1 and 5.\a");
            }
        }
        while (end);
     
     
      return(EXIT_SUCCESS);
     
    }
     
     
     
     
    void addClient2(int* cpt, CLIENT* client){
    cpt++;
    if(*cpt<10){
    char chaineNom [20];
    char chainePrenom[20];
     
      printf("Entrez votre Nom\n");
      scanf("%s", chaineNom);
      printf("Entrez votre prenom\n");
      scanf("%s", chainePrenom);
      client->nomClient=chaineNom;
      client->prenomClient=chainePrenom;
      printf("%s %s", client->nomClient, client->prenomClient);
    }
     
    }
    Le printf de la fonction affiche bien le nom et prenom, pourtant je passe son adresse et en retour j'ai pas ce qui doit etre affiché dans mon tableau

  2. #2
    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
    Bonjour,

    Tu stockes les noms et les prénoms dans des variables locales qui seront supprimées lors de la sortie de la fonction.

    Les pointeurs contenus dans ta structure CLIENT pointeront alors sur un espace non-alloué.

    Il faut que tu utilises les fonctions malloc et free.

  3. #3
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Autre problème, dans addClient2, cpt++ incrémente le pointeur, et pas la valeur de l’int pointé*! Il faut écrire (*cpt)++ (parenthèses nécessaires, car l’opérateur ++ a une priorité supérieure à celle de l’opérateur de déréférencement…).

  4. #4
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonjour,

    Avant toute chose, tu devrais sans doute reprendre tes cours de C ; ton code est, dans l'ensemble, assez brouillon. Ton premier problème vient des instructions des lignes 123 et 124 : avec celles-ci, tu ne fais que copier le premier caractère de chaineNom dans nouveauClient->nomClient. Si tu veux que nouveau->nomClient pointe vers chaineNom, tu ne devrais pas déréférencer tes pointeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nouveauClient->nomClient = chaineNom;
    nouveauClient->prenomClient = chainePrenom;
    De plus, étant donné que tu n'as pas vraiment besoin de passer par des pointeurs temporaires actuellement, tu pourrais allouer directement les membres de ta structure. Ceci dit, tu pourrais te créer un petit wrapper pour tes allocations dynamiques, histoire de gérer les OOM, bien que ce ne soit pas très utile ici. De la même manière, je ne comprends pas trop pourquoi utiliser l'allocation dynamique dans ton cas, puisque tu fixes une taille fixe dans ton malloc.

    D'autre part, que se passe-t-il quand *cpt est supérieur ou égal à 10 ? Tu ne sembles pas gérer ce cas, d'autant plus que ton code contient une fuite mémoire, lorsque, à la ligne 60, la valeur de tmp, allouée dynamiquement à la ligne 59, est écrasée par la valeur de retour de nouveauClient, elle aussi allouée dynamiquement.

    Si je puis me permettre un conseil : reprend ton code à plat, et, à l'aide d'un papier et d'un crayon, définis les différentes allocations dont tu auras besoin.

    Bonne journée.

    ÉDIT : Maintenant que tu as supprimé tes messages, j'ai l'air idiot.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

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

Discussions similaires

  1. Problème de max dans liste chainée
    Par chikita dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 19/11/2014, 19h16
  2. Réponses: 41
    Dernier message: 23/01/2014, 16h30
  3. Requete pour suppression de propagation dans liste chainée
    Par chris92 dans le forum Développement
    Réponses: 8
    Dernier message: 27/05/2009, 15h30
  4. Problème d'acces aux données d'une liste Chainée
    Par Le Payton dans le forum Langage
    Réponses: 4
    Dernier message: 27/08/2007, 11h00
  5. Donnée affichée dans liste modifiable
    Par puppusse79 dans le forum Access
    Réponses: 9
    Dernier message: 13/12/2006, 15h31

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