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 :

Défilement (code source)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    informaticien
    Inscrit en
    Mars 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : informaticien

    Informations forums :
    Inscription : Mars 2013
    Messages : 1
    Par défaut Défilement (code source)
    Bonjour,

    J'ai un problème avec mon code source qui doit défiler. Le voila :

    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
    void defiler(tfile *tete)
    {
        tfile *p,*q;
        p=tete;
        q=p->suivant;
        while(q!=NULL)
        {
          p=p->suivant;
          q=q->suivant;
     
     
        }
        p=NULL;
        free(q);
    }
    Je n'ai pas trouvé le problème.
    Merci d'avance.

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    J'ai un problème
    Je n'ai pas trouvé le problème.
    Ces deux phrases sont contradictoires. Si tu as un problème, donne les symptômes.

    Tu inventes deux pointeurs p et q auxquels tu affectes des valeurs mais tu ne leur fais rien faire.... sauf free(q).
    Mais quand tu fais free(q), non seulement tu libères de la mémoire qui ne t'appartient pas. Mais en plus le pointeur q est NULL puisqu'il sort de la boucle ("continuer tant que q n'est pas nul").

    Ton script marche puisqu'il ne fait rien.

  3. #3
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Si tu souhaites "faire défiler", je te déconseille de libérer... tu devrais laisser la file telle quelle. Mais garde le retour de fonction à "void".

    Par contre, si tu souhaites "vider la file", ton algo est bien parti !
    Il suffit de libérer p à chaque tour de boucle, et uniquement p.
    Puis tu renvoies un pointeur à NULL (pour que l'appelant se mette correctement à jour).
    Et pas besoin de faire avancer les 2 en même temps... p reçoit q, et q avance.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par gfarah Voir le message
    Bonjour,

    J'ai un problème avec mon code source qui doit défiler. Le voila :

    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
    void defiler(tfile *tete)
    {
        tfile *p,*q;
        p=tete;
        q=p->suivant;
        while(q!=NULL)
        {
          p=p->suivant;
          q=q->suivant;
     
     
        }
        p=NULL;
        free(q);
    }
    Je n'ai pas trouvé le problème.
    Merci d'avance.
    Bonsoir,

    le problème n'est pas seulement dans le code mais dans l'algorithme, dans la compréhension des pointeurs et dans le choix de ta structure de donnée.
    Mettre la valeur NULL dans p ne va pas mettre NULL dans le pointeur qui pointe vers p (ça c'est pour la compréhension des pointeurs en C).
    Ensuite l'algorithme ... il faut commencer pas l'écrire et penser aux cas spéciaux, comme «que faire si la file est vide», ou «que faire si la file ne contient qu'un élément», dans les autres cas la file contient au moins deux éléments et défiler revient à trouver l'élément E dont le suivant a un suivant NULL, une fois E trouvé tu sais que tu devras libérer la mémoire allouée pour le suivant de E et mettre E.Suivant à NULL. À toi d'écrire l'algorithme correspondant.
    Ensuite il faudra l'écrire en C. Je ne peux que te conseiller d'encapsuler la file dans sa propre structure et non de ne garder que la tête (c'est souvent plus pratique). Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct element {
      /* tout ce que tu as besoin pour tes données */
      struct element *suivant;
    };
     
    struct file {
      /* des trucs intéressants à garder comme le nombre d'éléments dans la file */
      struct element *tete;
    };
    Tu peux également si le cœur t'en dit garder un pointeur dans chaque élément vers son prédécesseur, et dans ta struct file un pointeur vers le dernier élément (ce qui simplifiera grandement défiler).
    Bien sûr, l'idéal sera d'écrire les fonction d'allocation, de libération, d'ajout, etc ...

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Solution au problème immédiat: Ce n'est pas p qu'il faut mettre à NULL (ce qui n'a aucun effet), c'est p->suivant qu'il faut régler à q->suivant.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Souvent un dessin (en plus de l'algorithme) permet de comprendre ce qui se passe :
    Nom : list.png
Affichages : 78
Taille : 13,3 Ko

    À la sortie de la boucle voilà où se trouvent les pointeurs p et q. Mettre p à NULL revient à déplacer la flèche vers NULL : ça ne change rien à la liste. Pour modifier la liste il faut bouger la flèche verte, cela signifie modifier le pointeur E.next après avoir fait ce qu'il faut au niveau gestion de la mémoire. Mais pour que cela fonctionne il faut d'abord que E existe (=il y a au moins deux éléments dans la liste) et le trouver.
    Nom : list2.png
Affichages : 66
Taille : 12,3 Ko

    Conclusion :

    Fais des dessins
    Construis ton algo
    Teste le sur des dessins
    Écris ton code
    Teste ton code

Discussions similaires

  1. [adaptation d'un code source] défilement horizontal
    Par Auteur dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/01/2010, 11h20
  2. Contribuez à la FAQ et aux CODES SOURCE XML
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 21/04/2008, 20h52
  3. Defragmenteur code-source
    Par ak-k dans le forum Windows
    Réponses: 7
    Dernier message: 25/08/2003, 14h36
  4. Je cherche le code-source d'un interface de Windows
    Par Robert A. dans le forum Windows
    Réponses: 5
    Dernier message: 02/06/2003, 09h45
  5. [VB6] Code source pour modifier MsgBox
    Par khany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 25/02/2003, 15h13

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