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 :

Utilisation de structure personnelle.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Par défaut Utilisation de structure personnelle.
    Bonjour,

    Lors d'un cours de C, mon prof m'a dit quelque chose qui m'a énormément surpris, de par son expérience je le crois mais en tiquant un peu.

    Suite à plusieurs lignes de codes qu'il nous a donné sur les listes doublement chainées, il y a un petit bug je me demande si cela ne vient de ce qui m'a choqué. Je vous explique, voici les structures sur lesquelles ont travaille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct cellule
    {
        int val;
        struct cellule *prec;
        struct cellule *suiv;
    } cellule;
     
    typedef cellule* liste;
    Apres dans une fonction qui parcourt la liste pour l'afficher voilà ce qui fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void print_liste (liste l)
    {
      liste tmp;
     
      tmp = (liste) malloc( sizeof(cellule) );
      tmp = l;  
      while(tmp != NULL)
      {
        printf("%d ",tmp->val);
        tmp = tmp->suiv;
      }
    }
    Personnelement j'aurais plus fait un truc comme ca (i.e sans allouer de la memoire a l'aide de malloc() ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void print_liste (liste l)
    {
      liste tmp;
     
      tmp = l;  
      while(tmp != NULL)
      {
        printf("%d ",tmp->val);
        tmp = tmp->suiv;
      }
    }
    Mis à part le fait que mon prof cast le malloc() pourriez-vous me donner votre avis s'il vous plaît!

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Fuite de mémoire garantie !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      tmp = (liste) malloc( sizeof(cellule) );
    Cette allocation n'est pas suivie d'une désallocation.... D'ou la fuite..

    En bref cette ligne se SERT A RIEN.... sauf à créer un bug.

    soit t'as mal vu soit change de prof !!!
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Par défaut
    Merci pour cette reponse rapide

    Donc on est bien d'accord, que cette ligne sert strictement à rien meme s'il compte rajouter un free() a la fin de la fonction?

    Je préfaire être sur car je dois expliquer ce cours à une amie se soir, donc je veux pas dire de betises!!

    merci d'avance

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Oui c'est bon sans la ligne, comme tu as fait c'est correct. Il faut juste garder l'adresse du début de ta liste c'est tout.

    Tiens d'ailleurs tu n'as même pas besoin d'une liste temporaire.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Par défaut
    Merki pour vos reponse.

    Comment peut-on faire pour parcourir la liste sans tmp?
    J'ai une idée mais perso je la considère comme très très sale....
    la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void print_liste (liste l)
    {
       while(l != NULL)
      {
        printf("%d ",l->val);
        l = l->suiv;
      }
    }
    (Code modifié après corrections)


    C'était un truc dans ce genre la??? Et si oui je suppose que ça doit pas être si sale que ca pourquoi?

  6. #6
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par barbsbou Voir le message
    Merki pour vos reponse.

    Comment peut-on faire pour parcourir la liste sans tmp?
    J'ai une idée mais perso je la considère comme très très sale....
    la voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void print_liste (liste l)
    {
       while(liste != NULL)
      {
        printf("%d ",liste->val);
        liste = liste->suiv;
      }
    }

    C'était un truc dans ce genre la??? Et si oui je suppose que ça doit pas être si sale que ca pourquoi?
    Oui c'est ça (enfin faut remplacer liste par l)
    C'est pas si sale que ça parce que tu ne modifies pas ton paramètre l, etant donné que tu ne peux pas modifier son adresse. Tu peux seulement modifié ce qui est pointé.

  7. #7
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Pourquoi cela serait sale ?

    tmp n'était pas nécessaire... et on peut effectivement utliser directement le paramètre "l" dans la fonction.

    En C, le passage de paramètre d'effectue par valeur... Donc si tu modifies la valeur de l dans la fonction, cela ne change pas la valeur de la variable utilisée pour l'appel de fonction...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

Discussions similaires

  1. Problème d'utilisation de structure en C++
    Par marcix dans le forum C++
    Réponses: 1
    Dernier message: 08/12/2007, 12h47
  2. Utiliser une classe personnelle dans un vector
    Par Mindiell dans le forum SL & STL
    Réponses: 16
    Dernier message: 01/03/2007, 17h42
  3. [XSLT] Comment utiliser une structure de type if-then-ELSE ?
    Par ribrok dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/11/2006, 12h39
  4. [C#]Pourquoi utiliser une structure plutôt qu'une classe?
    Par egoom dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/10/2006, 09h49
  5. Débutant: Question sur l'utilisation des structures
    Par pdgnr dans le forum C++Builder
    Réponses: 5
    Dernier message: 26/10/2006, 13h03

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