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 :

[commande ls] Problème avec tri


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut [commande ls] Problème avec tri
    Bonjour tout le monde!

    J'essaie de programmer la commande ls de linux.

    J'ai fait un premier fichier qui marche :
    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
    #include <stdlib.h> /* exit */
    #include <stdio.h> /* printf */
    #include <dirent.h> /* struct DIR */
    #include <errno.h> /* perror */
     
    int main (int argc, char * argv [])
    {
           DIR * ndir;  
           struct dirent * rdir;
     
           if (argc!=1)
           {
                fprintf(stderr,"Usage : ls\n");
                exit(1);
           }
     
           /* ouverture du repertoire courant */
           if((ndir=opendir("."))==NULL)
           {
                 perror("OPENDIR");
                 exit(2);
           }
     
           rdir=readdir(ndir);
     
           /* listage des fichiers */
           while (rdir != NULL)
           {
                 printf("%s  ",rdir->d_name);
                 rdir=readdir(ndir);
           }
     
           printf("\n");
     
           closedir(ndir);
     
           exit(0);
    }
    Sauf que les elements ne sont pas dans l'ordre alphabétique.
    J'ai donc ajouté un trie. Ca compile aussi mais ca me donne le meme resultat que le premier.

    J'ai indiqué la ligne où je pense que l'erreur est.

    Deuxieme fichier :
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include <stdlib.h> /* exit */
    #include <stdio.h> /* printf */
    #include <dirent.h> /* struct DIR */
    #include <errno.h> /* perror */
     
    struct maillon {
           char * valeur;
           struct maillon *suivant;
           struct maillon *precedant;
    };
     
    int main (int argc, char * argv [])
    {
        struct maillon *tete; /* tete de liste */
        struct maillon *nm; /* sert a creer de nouveaux maillons */
        struct maillon *buff; /* sert a se ballader */
        int nb_maillon=0; /* nombre de maillons (pour affichage) */
        int i; /* compteur */
     
        DIR * ndir;  
        struct dirent * rdir;
     
        tete=NULL;
     
        if (argc!=1)
        {
            fprintf(stderr,"Usage : lss\n");
            exit(1);
        }
     
        /* ouverture du repertoire courant */
        if((ndir=opendir("."))==NULL)
        {
             perror("OPENDIR");
             exit(2);
        }
     
        rdir=readdir(ndir);
     
        /* LISTAGE DES FICHIERS */
        while (rdir != NULL)
        {
            nm=malloc(sizeof(struct maillon)); /* nouveau maillon */
            (*nm).valeur=rdir->d_name; /* affectation de la valeur */
            nb_maillon=nb_maillon+1; /* incrementation */
     
            /* S'il n'y avait pas de maillon */
            if (tete==NULL)
            {
               tete=nm;
               (*tete).suivant=tete;
               (*tete).precedant=tete;
            }
            else 
            {
                /* TRIE */
                buff=tete;
                /* On se ballade pour trouver la place du nouveau maillon */
                while ((*nm).valeur>(*buff).valeur)/*-------------------------------- PROBLEME sur la condition (je pense) il doit penser que chaque nouvelle valeur est superieure */
                {
                      buff=(*buff).suivant;
                      /* Si le nouveau maillon doit etre en derniere place */
                      if (buff=tete)
                      {
                         break;
                      }
                }
                /* Affectation de nm */
                (*nm).suivant=buff;
                (*nm).precedant=(*buff).precedant;
                /* Affectation du maillon de buff */
                (*buff).precedant=nm;
                /* Affectation du maillon avant buff */
                (*(*nm).precedant).suivant=nm;
     
                /* Si le nouveau maillon doit etre en 1ere place */
                if ((*nm).valeur<(*tete).valeur)
                {
                   tete=nm;
                }
            }
            rdir=readdir(ndir);
        }
     
        /* AFFICHAGE */
        buff=tete;
        for (i=0;i<nb_maillon;i=i+1)
        {
            printf("%s  ",(*buff).valeur);
            buff=(*buff).suivant;
        }
     
        printf("\n");
     
        closedir(ndir);
     
        exit(0);
    }


    Merci d'avance

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,

    En effet, ton code ne risque pas trop de marcher...

    Plusieurs raisons (je me base sur ton 2nd fichier) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*nm).valeur = rdir->d_name; /* affectation de la valeur */
    (*nm).valeur (qui se note aussi nm->valeur) ne fait que prendre la valeur du pointeur rdir->d_name. Un strdup(3) te permettras de dupliquer la chaine dans la memoire et ainsi de ne pas la perdre au prochain appel de readdir.
    (strdup fait un malloc, donc il faut le free, au meme titre que ta liste chainee)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((*nm).valeur > (*buff).valeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((*nm).valeur<(*tete).valeur)
    Tu compare des pointeurs sur char*, pas les chaines en elles-meme. Ici, strcmp(3) sera ton ami.


    C'est une affectation, pas un test d'egalite.


    Je te conseille de relire un cours sur les pointeurs et sur les chaines de carateres (ce sont deux choses differentes).

    Dernier point, n'oublie pas de free ta liste a la fin de ton programme.

    Voila,
    bon code et bonne soiree

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Ok. Merci.
    Je vais bosser ca alors.

Discussions similaires

  1. problème avec try except et try finally !?
    Par jano_dave dans le forum Débuter
    Réponses: 2
    Dernier message: 15/09/2009, 14h55
  2. Réponses: 8
    Dernier message: 08/11/2008, 22h16
  3. Problème avec try-except
    Par steph_1 dans le forum Langage
    Réponses: 8
    Dernier message: 15/01/2008, 15h59
  4. problème avec try
    Par michel71 dans le forum Delphi
    Réponses: 2
    Dernier message: 06/05/2007, 12h58
  5. Problème avec Try ... Except
    Par Kcintim dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/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