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 :

problème de structure


Sujet :

C

  1. #1
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2011
    Messages : 128
    Par défaut problème de structure
    je veux créer une structure de donnée qui contient 2 champs le premier c'est un caractère, le deuxième c'est un pointeur de même nature qui pointe sur la structure en cour d'initialisation, voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     struct element
    {
    char c;
    struct element *rep;
    };
     
    struct element creer_element(char a)
    {
    struct element el;
    el.c=a;
    el.rep=
    }
    mais lorsque je veux afficher rep il m'affiche rien, quel est le probléme?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    Salut,

    Tu veux afficher rep ? ou rep.c ?
    et il faudrait aussi que tu malloc el dans "creer_element"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    el = malloc(sizeof (element));
    parce que là, rep contient juste une adresse.

  3. #3
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2011
    Messages : 128
    Par défaut
    Citation Envoyé par nemesis57 Voir le message
    Salut,

    Tu veux afficher rep ? ou rep.c ?
    et il faudrait aussi que tu malloc el dans "creer_element"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    el = malloc(sizeof (element));
    parce que là, rep contient juste une adresse.
    lorsque je fai une allocation dynamique il m'affiche cet erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2440: 'initialisation'*: impossible de convertir de 'void *' en 'element'
    le problème c'est lorsque j'instancié 2 variables de ce type, ils seront créer mais le changement du champ c sera effectuer toujours sur le premier élément ! et pour le deuxième élément il m'affiche n'importe quoi!: voici la partie complète de ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct element creer_element(char a)
    {
    struct element el;
    el.c=a;
    el.rep=(struct element *) malloc(sizeof(struct element));
    el.rep=⪙
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    tu veux faire quoi exactement avec tes structures?
    un liste chainée ?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Je n'ai pas compris ce que tu veux réellement faire.

    En tout cas, y a deux problèmes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    el.rep=(struct element *) malloc(sizeof(struct element));
    el.rep=⪙
    Tu provoques une fuite de mémoire. En effet, tu donnes à "rep" la valeur retournée par malloc et puis tu l'écrases juste après...

    Deuxième problème, tu écrases cette valeur par l'adresse d'un objet local... qui va disparaitre lorsque tu vas quitter la fonction. A ne JAMAIS faire !

    Pour finir, il est totalement inutile de caster le retour de malloc. En C, les conversions void* et autre_type* et vice versa sont implicites. Caster permet de camoufler des problèmes, ce qui n'est pas recommandable :
    * compilation avec un compilateur C++ au lieu d'un compilateur C
    * oubli de l'inclusion de <stdlib.h>

    EDIT :
    oops... vilaine faute de frappe..

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    comment ça il est inutile de caser le retour de malloc ?
    dans le cas d'une liste chainée, s'il veut ajouter un element il faut bien qu'il aloue la memoire pour cet element
    et en principe il est pas obligé de le caster en void*

    je sais pas ... un exemple de fonction pour ajouter un element a une liste chainé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
     
    void            add_elem_end(char *name, char *value, t_li *l)
    {
      t_elem        *e;
     
      e = malloc(sizeof (t_elem));
      if (e == 0)
        exit(-1);
      e->next = 0;
      e->name = name;
      e->value = value;
      if (l->tail)
        l->tail->next = e;
      l->tail = e;
      l->size++;
      if (!l->head)
        l->head = e;
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    désolé jeroman ta faute de frappe (caster) a changé la façon dont j'ai interprété ta phrase --"
    je viens de remarquer ça, faut que j'aille dormir je crois ^^
    enfin bref, mayssaMM,
    comme le dit jeroman, il faudrait que tu expliques ce que tu veus faire avec ta structure, on pourrait beaucoup mieux t'aider

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    en fate quand tu malloc une structure, ça malloc ce qu'il contient
    ensuite il y a quelques erreures dans toutes tes assignations...
    si t'essaye de structurer un peu ton programme, ça te donne à peu pres ça :


    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
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef struct  s_elem
    {
      char          info;
      struct s_elem *next;
    }               t_noeud;
     
    typedef struct  s_list
    {
      t_noeud       *head;
      t_noeud       *tail;
      int           size;
    }               t_ensemble;
     
    void            init_list(t_ensemble *l)
    {
      l->head = 0;
      l->tail = 0;
      l->size = 0;
    }
     
    void            add_elem_end(char info, t_ensemble *l)
    {
      t_noeud       *e;
     
      e = malloc(sizeof (t_noeud));
      if (e == 0)
        exit(-1);
      e->next = 0;
      e->info = info;
      if (l->tail)
        l->tail->next = e;
      l->tail = e;
      l->size++;
      if (!l->head)
        l->head = e;
    }
     
    char            get_elem_at_pos(int position, t_ensemble *l)
    {
      int           i;
      t_noeud       *e;
     
      e = l->head;
      for (i = 0; position > 0 && i < position && position < l->size; i++)
        e = e->next;
      if (!e)
        return (0);
      return (e->info);
    }
     
    void    main()
    {
      t_ensemble    list;
     
      init_list(&list);
      add_elem_end('a', &list);
      add_elem_end('b', &list);
      printf("[%c]", get_elem_at_pos(0, &list));
      printf("[%c]", get_elem_at_pos(1, &list));
    }
    désolé je t'ai toute fait en un fichier (un peu la flême ^^)
    s'il y a des choses que tu comprends pas, n'hesite pas a poser des questions

  9. #9
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2011
    Messages : 128
    Par défaut
    Citation Envoyé par nemesis57 Voir le message
    en fate quand tu malloc une structure, ça malloc ce qu'il contient
    ensuite il y a quelques erreures dans toutes tes assignations...
    si t'essaye de structurer un peu ton programme, ça te donne à peu pres ça :


    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
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef struct  s_elem
    {
      char          info;
      struct s_elem *next;
    }               t_noeud;
     
    typedef struct  s_list
    {
      t_noeud       *head;
      t_noeud       *tail;
      int           size;
    }               t_ensemble;
     
    void            init_list(t_ensemble *l)
    {
      l->head = 0;
      l->tail = 0;
      l->size = 0;
    }
     
    void            add_elem_end(char info, t_ensemble *l)
    {
      t_noeud       *e;
     
      e = malloc(sizeof (t_noeud));
      if (e == 0)
        exit(-1);
      e->next = 0;
      e->info = info;
      if (l->tail)
        l->tail->next = e;
      l->tail = e;
      l->size++;
      if (!l->head)
        l->head = e;
    }
     
    char            get_elem_at_pos(int position, t_ensemble *l)
    {
      int           i;
      t_noeud       *e;
     
      e = l->head;
      for (i = 0; position > 0 && i < position && position < l->size; i++)
        e = e->next;
      if (!e)
        return (0);
      return (e->info);
    }
     
    void    main()
    {
      t_ensemble    list;
     
      init_list(&list);
      add_elem_end('a', &list);
      add_elem_end('b', &list);
      printf("[%c]", get_elem_at_pos(0, &list));
      printf("[%c]", get_elem_at_pos(1, &list));
    }
    désolé je t'ai toute fait en un fichier (un peu la flême ^^)
    s'il y a des choses que tu comprends pas, n'hesite pas a poser des questions
    Lorsque j'exécute ce code il m'affiche l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2440: '='*: impossible de convertir de 'void *' en 't_noeud *'
    pour le ligne qui contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e = malloc(sizeof (t_noeud));

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    utilise un autre compilateur : gcc

  11. #11
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2011
    Messages : 128
    Par défaut
    Citation Envoyé par nemesis57 Voir le message
    utilise un autre compilateur : gcc
    comment je peu utiliser ce compilateur ?!

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    sous linux:
    apt-get install gcc
    sous windows:
    je pense que tu trouveras des infos ici

  13. #13
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Avril 2011
    Messages : 128
    Par défaut
    Citation Envoyé par nemesis57 Voir le message
    sous linux:
    apt-get install gcc
    sous windows:
    je pense que tu trouveras des infos ici
    après l'installation comment je peux compiler mon programme avec gcc ?!

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Lorsque j'exécute ce code il m'affiche l'erreur:
    Voilà une des raisons pour lesquelles il ne "faut pas" caster le retour malloc. Si tu as cette erreur, c'est parce que tu compiles en C++ et non en C. En C++ ce genre de cast est explicite et non implicite, d'où erreur.

    Vu le numéro de l'erreur, je suppose que tu utilises Visual C++. Personnellement, je ne l'utilise pas, mais il y a une manip à faire pour qu'il compile en C et non en C++. Sur le forum, le sujet a déjà été abordé. Essaye de faire une recherche.

Discussions similaires

  1. Problème de structure "récursive"
    Par Pxnet dans le forum C
    Réponses: 5
    Dernier message: 21/01/2007, 17h20
  2. Problème de structures
    Par Zikas-r dans le forum C
    Réponses: 6
    Dernier message: 27/12/2006, 00h01
  3. Réponses: 16
    Dernier message: 21/08/2006, 14h12
  4. [Structures]Problème sur structures
    Par kendras dans le forum C++
    Réponses: 5
    Dernier message: 07/06/2006, 10h20
  5. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16

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