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 :

Envoyer le résultat d'une fonction dans une autre


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Envoyer le résultat d'une fonction dans une autre
    Bonjour à tous,


    Je dois essayer de "recoder" la fonction find avec le plus grand nombre d'options possible.

    A l'aide de la structure dirent, j'arrive à parcourir tous les dossiers depuis celui fournit en paramètre (argv[1]) et à lister tous les fichiers trouvés : fonction recherche.


    Cependant, j'aimerais envoyer le résultat trouver lors de cette fonction dans différentes fonctions qui feront le tri (par exemple) :

    - fonction (type ), qui me listera uniquement les dossiers ou fichiers, etc.

    - fonction (maxdepth,mindepth) pour la récursivité.

    - fonction (rwx) savoir si le fichier est -readable, -writable ou -executable.


    J'ai déjà quelques fonctions de prêtes mais je coince à cette étape où je n'arrive pas à utiliser le résultat trouver au sein de la fonction "recherche".

    Voici mon code :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <string.h>
     
     
    char   recherche(char *rep, char *fichier, DIR *new_dir);
    void   *xmalloc_mem(int longueur_chaine, unsigned char size);
     
    int main(int argc, char **argv)
    {
        char  *chemin = NULL;
        char  *fichier = NULL;
        chemin=argv[1];
    	recherche(chemin, fichier, NULL);
    	return 0;
    }
     
    char recherche(char *chemin, char *fichier, DIR *new_dir)
    {
      struct dirent *info_d;
      DIR           *dir;
      char          *path;
      int            longueur_chaine;
     
     
      if ((dir = opendir(chemin)) == NULL)
        {
          printf("find: %s: No such file or directory\n", chemin);
          return ;
        }
     
      while (info_d = readdir(dir))
        if ((strcmp(info_d->d_name, ".") != 0) && (strcmp(info_d->d_name, "..") != 0))
          {
     
    		longueur_chaine=(strlen(chemin)+strlen(info_d->d_name)+2);
    		path = xmalloc_mem(longueur_chaine,sizeof(*path));
            strcat(path, chemin);
            strcat(path, info_d->d_name);
    		/* recherche tous les fichiers dans le repertoire */
            if (strstr(info_d->d_name,"") != NULL) printf("%s\n",path);
            strcat(path, "/");
           if ((new_dir = opendir(path)) != NULL)
            recherche(path, fichier, new_dir);
            free(path);
          }
      closedir(dir);
    return 1;
    }
     
    /**********************************************************************/
    //FONCTION ALLOUER MEMOIRE
     
    void *xmalloc_mem(int longueur_chaine, unsigned char size)
    {
           char *ALLOCATION_2;
     
          if ((ALLOCATION_2=malloc(longueur_chaine * size)) == NULL){
    	    printf("Erreur allocation\n");
            exit(-1);
            }
           memset(ALLOCATION_2, '\0',size);
      return (ALLOCATION_2);
    }
    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    salut,

    tu sauvegardes ta liste dans un espace mémoire réservé avec malloc. Ensuite, il faut que ta fonction retourne le pointeur de cette espace pour que les autres fonctions sachent où aller chercher les données.
    Ne pas oublier de faire un free() une fois tout le traitement terminé !!!

    Au lieu de que ta fonction renvoie un basique void*, je te conseille de typer la valeur retournée via une définition de structure (lorsqu'une fonction renvoie un void*, on ne sait pas trop ce qu'il y a dans l'espace mémoire, alors que si on renvoie un pointeur typé, c'est beaucoup plus clair).
    => tu peux t'inspirer des listes chainée pour la structure des données ou de la structure d'un tableau avec le dernier élément qui vide (pour détecter la fin du tableau)

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

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci d'avoir répondu aussi vite.

    J'ai réussi à faire ce que je voulais, merci. J'arrive à envoyer la liste dans plusieurs fonctions qui tri les informations :

    - liste du contenu
    - liste uniquement les fichiers
    - liste uniquement les fichiers mp3

    Je me trouve maintenant devant un nouveau problème : comment gérer le nombre de paramètres (options).
    Je m'explique, je voudrais que le dernier paramètre, donc la dernière fonction de trie, renvoi le résultat final (return ou printf).

    Admettons que j'ai ceci : find /root/script/ -type f -name "toto"

    Il faudrait par conséquent que la "fonction_name" renvoi le résultat final du tri.

    Je peux connaître les arguments qui seront passés en paramètres et ainsi connaître la dernière fonction mais je ne vois pas comment renvoyer le dernier résultat de celle-ci.

    Merci d'avance.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    désolé mais je n'ai pas tout compris

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Selon les paramètres que je vais indiquer en option, la liste parcourra les différentes fonctions de "tri".

    Comment indiquer à la dernière fonction (donc au dernier parametre) l'affichage du résultat voulu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Réponses: 2
    Dernier message: 04/01/2015, 15h28
  3. [XSLT 1.0] Mettre le résultat de l'appel d'une fonction dans une variable
    Par Giovanny Temgoua dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/01/2012, 17h47
  4. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  5. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04

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