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 :

aide pour coder la fct ls


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut aide pour coder la fct ls
    salut a tous,

    je refait surface, avec bcp de notions vues, je suis en ce moment sur la codage de la fonction my_ls
    je gere l'option -l et suis en train de faire l'option -R
    seul probleme comme vous devez le savoir le -R affiche tout les fichiers du repertoire donne et ouvre aussi tout les repertoires present dans le repertoire donnee,
    j'ai coder cette option en faisant un appel recursif a chaque fois qu'il tombe sur un repertoire, seul hic, ca ne fonctionne pas..................

    voici le code de l'option -R;
    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
     
     
    #include <stdio.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <dirent.h>
     
    int	option_r(char *name)
    {
      struct dirent	*d;
      struct stat info_file;
      DIR *dir;
     
      if ((dir = opendir(name)) == (NULL))
        return(0);
      while ((d = readdir(dir)) != (NULL))
        {
          if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0)
    	continue;
          else
    	{
    	  if (stat(d->d_name, &info_file) == - 1)
    	    return(0);
    	  if (S_ISDIR(info_file.st_mode))
    	    option_r(d->d_name);
    	  printf("%s\n", d->d_name);
    	}
        }
      closedir(dir);
    }
     
    int main()
    {
    option_r(".");
    }
    le resulat est qu'il m'affiche les noms de fichiers du repertoire courant uniquement.....alors qu'il existe un repertoire dans ce repertoire courant et qu'il est cense l'ouvrir............?

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Quand tu vérifies le retour de tes fonctions, rajoutes un petit message pour voir si c'est ça qui fait sortir ou pas.

    Ensuite ta fonction est censée retourné rien (void), or je vois des return 0.

  3. #3
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Indication : mets des accolades pour les blocs if/else, et tu verras pourquoi. Une bonne pratique de programmation consiste à en mettre même quand il n'y a qu'une seule instruction. N'oublie pas non plus que tu fais de la récursion.

    Bon allez, je le dis ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (S_ISDIR(info_file.st_mode)) 
    {
      printf("%s\n", d->d_name);
      option_r(d->d_name);
    }
    else 
    {
      /* ne pas oublier celui-là non plus bien sûr */
      printf("%s\n", d->d_name); 
    }
    Sinon, return n'est pas une fonction, return(0) c'est moche, return 0; plutôt. int main(void) est la forme que doit avoir le main lorsqu'il n'y a pas de paramètres, c'est de l'enculage de mouches pour certains, mais c'est ce que dit la norme. Initialise aussi tes variables.

    A+

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut ok
    ok je rectifie tout ca et je test

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Foobar1329
    Indication : mets des accolades pour les blocs if/else, et tu verras pourquoi. Une bonne pratique de programmation consiste à en mettre même quand il n'y a qu'une seule instruction.
    Oui, mais la norme Epita est chiante (certains points sont très discutables) et en sachant qu'elle n'autorise que 25 lignes par fonction, ça oblige souvent à faire compréssé... Pas vrai aimad41 ?

    Citation Envoyé par Foobar1329
    Sinon, return n'est pas une fonction, return(0) c'est moche, return 0; plutôt.
    Toujours cette foutus norme

  6. #6
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par malves
    Oui, mais la norme Epita est chiante (certains points sont très discutables) et en sachant qu'elle n'autorise que 25 lignes par fonction, ça oblige souvent à faire compréssé... Pas vrai aimad41 ?
    C'est quoi, la "norme" Epita ??? Une convention de codage ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    Oui excuse moi je n'ai pas précisé. C'est la norme de codage de l'école Epita (Epitech aussi) c'est une école d'info à Paris.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par zooro
    C'est quoi, la "norme" Epita ??? Une convention de codage ?
    Oui, pas plus 25 lignes par fonctions, pas du de 80 caracteres par ligne (il me semble), et plein d'autre trucs plus ou moins discutables pour ma part...

    J'ai trouvé le problème.

    Lors de l'appel à stat quand tu rentres dans un repertoire, l'appel à stat échoue, car il ne trouve pas le fichier.

    Une solution consiste à placer à placer un
    Au début de la fonction option_r (après le opendir) et juste après l'appel récursif à option_r

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (S_ISDIR(info_file.st_mode))
    {
    	    option_r(d->d_name);
                chdir(name);
    }

  9. #9
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par malves
    Oui, mais la norme Epita est chiante (certains points sont très discutables) et en sachant qu'elle n'autorise que 25 lignes par fonction, ça oblige souvent à faire compréssé... Pas vrai aimad41 ?



    Toujours cette foutus norme
    Bah, une norme n'est jamais là pour faire joli. En l'occurence, le standard est un contrat entre le programmeur et l'implémentation. Chris Torek, grand gourou du C parmi les gourous l'explique très bien sur son site. Cette norme est même bien plus que ça car elle est internationale, c'est donc un contrat entre tous les programmeurs C et les compilos C du monde et aussi un moyen de se comprendre entre tout les programmeurs C du monde. Il y a aussi un aspect "génie logiciel" fort qui vise à capitaliser les bonnes pratiques et à les partager, pour faire du code portable, maintenable, évolutif et réutilisable. Les normes sont incontournables dans le cadre de gros projets.

    Quant aux conventions de codage Epita, je ne les connais pas, mais imposer 25 lignes max par fonction en C me paraît discutable.

    A+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Skyrunner
    Une solution consiste à placer à placer un
    De mémoire ils n'ont pas le droit à chdir(). A confirmer.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par malves
    De mémoire ils n'ont pas le droit à chdir(). A confirmer.
    Dans ce cas là, il n'a qu'à concatener les différents répertoires et le nom du fichier pour former le chemin complet.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Foobar1329
    Bah, une norme n'est jamais là pour faire joli.
    On est d'accord.

    Citation Envoyé par Foobar1329
    Il y a aussi un aspect "génie logiciel" fort qui vise à capitaliser les bonnes pratiques et à les partager, pour faire du code portable, maintenable, évolutif et réutilisable. Les normes sont incontournables dans le cadre de gros projets.
    Encore d'accord.

    Citation Envoyé par Foobar1329
    Quant aux conventions de codage Epita, je ne les connais pas, mais imposer 25 lignes max par fonction en C me paraît discutable.
    C'est exactement le point que je critique le plus dans cette norme. 25 lignes c'est plus sympa à lire, mais parfois une fonction de 70 lignes est plus claire que 3 fonctions voire 4 plus petites. De plus pour respecter la norme les étudiants découpent les fonctions n'importe comment. Résultat: ça devient illisible.

  13. #13
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Foobar1329
    Quant aux conventions de codage Epita, je ne les connais pas, mais imposer 25 lignes max par fonction en C me paraît discutable.
    De manière générale, il est bon d'essayer de faire des fonctions de moins d'un écran de long (entre 25 et 50 lignes). Sinon, on peut certainement la scinder en plusieurs sous-fonctions.

    Allez faire un tour sur l'échelle du goret d'Emmanuel Delahaye
    Et ne rigolez pas, le projet sur lequel je bosse doit être force 50 au moins, avec des fonctions de 26.000 lignes, des fichiers sources C de plusieurs mégas ! Bref, du grand n'importe quoi.

  14. #14
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut aide pour coder la fct ls
    bonjour,

    je rencontre un probleme d'ouverture de repertoire, je code la fonction ls basique qui liste les fichiers d'un repertoire donne en parametre, sauf que ma fonction ne fonctionne que qvec el repertoire courant...........

    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
     
     
    #include "my.h"
    #include <grp.h>
    #include <pwd.h>
     
    int	parcour_rep(char *rep)
    {
      struct dirent	*d;
      struct stat	info_file;
      DIR	*dir;
     
      if ((dir = opendir(rep)) == (NULL))
        {
          printf("impossible d'ouvrir %s\n", rep);
          return(0);
        }
      while ((d = readdir(dir)) != (NULL))
        {
          if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0)
    	continue;
          else
    	{
    	  if (stat(d->d_name, &info_file) == - 1)
    	    return(0);
    	  if (S_ISDIR(info_file.st_mode))
    	    printf("d :");
    	  else
    	    printf("- :");
    	  printf("%s\n", d->d_name);
    	}
        }
      closedir(dir);
    }
     
     
    int	main(int ac, char **av)
    {
      DIR	*dir;
      char	*name;
     
      if (ac > 1)
        {
          if (av[1][0] == '-' && av[1][1] == 'l')
    	{
    	  parcour_rep(av[2]);
    	  return(0);
    	}
          return(0);
        }
      return (0);
    }

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    lol il serais temps de s'y mettre, c'est rammasse vendredi matin

    pour ta question, chdir() est la solution. utilise le juste apres ton opendir

  16. #16
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    g t close pdt 5 jours a cause d'un make sur la gate, super la politique dans cette ecole non seulement tu peut pas travailler pdt ces 5 jours donc bonjour le retard, mais en plus tu te ramasse un jour de travail d'interet general, et merci pour l'info ca fonctionne maintenant...

    autre question comment faire pour qu'il m'affiche les noms par ordre alphabetique.........?

  17. #17
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par aimad41
    autre question comment faire pour qu'il m'affiche les noms par ordre alphabetique.........?
    Tu les tries...

  18. #18
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut ok
    oui mais de quelle maniere, un tableau de structure si oui comment le faire svp!!!!

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par aimad41
    oui mais de quelle maniere, un tableau de structure si oui comment le faire svp!!!!
    qsort(). Faut ce que tu peux et poste ton code si tu as un problème.

Discussions similaires

  1. [Généralités] Aide pour coder un VNC
    Par gabcouts dans le forum WinDev
    Réponses: 3
    Dernier message: 06/08/2010, 16h59
  2. Réponses: 0
    Dernier message: 05/10/2009, 22h59
  3. [Joomla!] Aide pour coder un module ou en modifier
    Par Ninja_En_Short dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 07/08/2008, 11h20
  4. aide pour coder la fonction who de unix
    Par aimad41 dans le forum Linux
    Réponses: 4
    Dernier message: 21/12/2006, 09h29
  5. [Système] Aide pour coder l'url rewriting
    Par brousaille dans le forum Langage
    Réponses: 3
    Dernier message: 10/10/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