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

  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

  8. #8
    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
    oui merci skyrunner et vicenzo, je sais que ca passe par valeur et non par adresse c'est pour ca que j'ai proposé le bout de code en modifiant 'l', mais je trouve ça pas très propre quand normalement d'autres personnes plus ou moins expérimentés doivent lire mon code après pour comprendre...

    En soit ce n'est pas que c'est sale mais pas très pédagogue...enfin bref on va pas fair eun troll sur ca lolllll

    En tout cas merci de vos reponses je me sent rassuré
    a bientôt

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 barbsbou Voir le message
    oui merci skyrunner et vicenzo, je sais que ca passe par valeur et non par adresse c'est pour ca que j'ai proposé le bout de code en modifiant 'l', mais je trouve ça pas très propre quand normalement d'autres personnes plus ou moins expérimentés doivent lire mon code après pour comprendre...

    En soit ce n'est pas que c'est sale mais pas très pédagogue...
    Tu as bien réagi sur l'erreur du prof.

    Quand à la suppression du tmp, je dirais que c'est techniquement faisable, mais pas souhaitable pour des question de lisibilité. Et puis, ca rompt le principe des listes chainées qui veut que l'on ne perde jamais le début de la liste... (Eh, oui, si pour une raison ou pour une autre tu devais reparcourir la liste, tu serais bien embêté...) Alors, l'économie mémoire réalisé par la suppression du tmp vaut-elle le coup de s'embêter ?

  10. #10
    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 Emmanuel Delahaye,
    mais en somme je ne sais quelle référence donner à lire, ou comment persuader mon prof sans le vexer!! Sachant que je lui avait posé la question en cours et qu'il m'avait répondu quelque chose dont il avait l'air persuadé devant toute la classe!!

    Sinon je suis tout à fait d'accord avec toi concernant la suppression du tmp, mais pour les motifs que tu as invoqué je reste sur ma décision de le garder. Et, de plus on est pas encore au niveau de l'optimisation du code, mais juste une petite introduction pour s'entrainer. De plus vu que j'explique à une amie le C à partir de ce source...c'est mieux d'un point de vue pédagogique!!

    En tout cas je vous remercie à tous de votre colaboration.

    PS si quelqu'un à une idée pour faire comprendre l'erreur à mon prof avec beaucoup de diplomatie, je suis preneur!!

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par barbsbou Voir le message
    PS si quelqu'un à une idée pour faire comprendre l'erreur à mon prof avec beaucoup de diplomatie, je suis preneur!!
    Donne-lui le lien vers ce post...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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, 13h47
  2. Utiliser une classe personnelle dans un vector
    Par Mindiell dans le forum SL & STL
    Réponses: 16
    Dernier message: 01/03/2007, 18h42
  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, 13h39
  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, 10h49
  5. Débutant: Question sur l'utilisation des structures
    Par pdgnr dans le forum C++Builder
    Réponses: 5
    Dernier message: 26/10/2006, 14h03

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