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 :

passer un char** en argument


Sujet :

C

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

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut passer un char** en argument
    bonjour,

    La fonction suivante a pour but de rechercher certains fichiers dans un répertoire et les rendre dans un tableau à 2 dimensions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long ExploreRep(char *, char **);
    Pour l'appel de la fonction je procéde ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TmpNb = ExploreRep(l_Repertoire_Principal,l_ListeFichiers);
    où TmpNB reçoit le nombre de fichier trouvés dans le répertoire.

    Mais l_ListeFichiers reste vide en sortie de ma fonction alors qu'il est bien remplie dans la fonction ....
    je sens que je ne suis pas loin.....mais j'y arrive pu ..... help ?

    merci les gens

  2. #2
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    sans le code de ExploreRep, difficile a répondre.

    A vue de nez, le problème pourrait etre le suivant:

    Dans ta fonction tu crée une variable vers laquelle pointe l_ListeFichiers. Ensuite dans ta fonction toujours tu remplis l_ListeFichiers. Mais à la fin de ta fonction, la variable crée est détruite, et donc l_ListeFichiers pointe vers n'importe quoi.

    c'est une erreur fréquente et:
    Mais l_ListeFichiers reste vide en sortie de ma fonction alors qu'il est bien remplie dans la fonction ....
    me fait penser que ça pourrait être à ça.

    Mais sans ton code, difficile d'être sur...

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

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    oups, voici le code de la fonction:

    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
     
    long ExploreRep(char * p_Chemin,
                    char ** p_ListeFichiers)
    {
    	long NbFiles, cr;
    	long l_indiceFichier;
    	NbFiles = 0;
    	p_ListeFichiers = malloc(sizeof(char*)*CST_NB_Fichiers_A_Lire25);
     
    	DIR* rep;
    	struct dirent *read;
     
    	//rep = opendir(p_Chemin);
    	if ((rep = opendir(p_Chemin)) == NULL)
        {
                perror("opendir");
                return 0;
        }
     
    	//on passe les repertoire . et ..
    	read = readdir(rep);
    	read = readdir(rep);
    	while(read = readdir(rep))
    	{
    		NbFiles++;
    		l_indiceFichier=NbFiles-1;
    		p_ListeFichiers[l_indiceFichier]=malloc(sizeof(char*)*255);
    		strcpy(p_ListeFichiers[l_indiceFichier],read->d_name);
    		printf("listefic[%d]=%s\n",l_indiceFichier, p_ListeFichiers[l_indiceFichier]);
    	}
     
       return NbFiles;
    }

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    p_ListeFichiers est une variable locale à la fonction et le paramètre d'appel correspondant ne peut être modifié. On devrait avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    long ExploreRep(char * p_Chemin, 
                    char *** p_ListeFichiers) 
    { 
       long NbFiles, cr; 
       long l_indiceFichier; 
       NbFiles = 0; 
       *p_ListeFichiers = malloc(sizeof(char*)*CST_NB_Fichiers_A_Lire25); 
    .....
     
          (*p_ListeFichiers)[l_indiceFichier]=malloc(sizeof(char)*255);
    .....
    A noter que le dernier malloc n'est pas sizeof(char*)*255), mais 255

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

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    la suite des festivités:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char* l_Repertoire_Principal;
    char** l_ListeFichiers;
     
    ...
     
    TmpNb = ExploreRep(l_Repertoire_Principal,&l_ListeFichiers);
       //boucle pour controle en DEBUG
       for(i=0;i<TmpNb;i++)
    	printf("ficname sortie=%s\n",&l_ListeFichiers[i]);
    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
     
    long ExploreRep(char * p_Chemin,
                    char *** p_ListeFichiers)
    {
    	long NbFiles, cr;
    	long l_indiceFichier;
    	NbFiles = 0;
    	*p_ListeFichiers = malloc(sizeof(char*)*CST_NB_Fichiers_A_Lire25);
    	int i;
    	DIR* rep;
    	struct dirent *read;
     
    	if ((rep = opendir(p_Chemin)) == NULL)
        {
                perror("opendir");
                return 0;
        }
     
    ...
    	while(read = readdir(rep))
    	{
    		NbFiles++;
    		l_indiceFichier=NbFiles-1;
    		p_ListeFichiers[l_indiceFichier]=malloc(255);
    		strcpy(p_ListeFichiers[l_indiceFichier],read->d_name);
    	}
     
    //boucle pour controle en DEBUG
    for(i=0;i<NbFiles;i++)
    		printf("ficname=%s\n",p_ListeFichiers[i]);
     
       return NbFiles;
    }
    en sortie:

    avant de quitter la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ficname=Copie (2) de toto.txt
    ficname=Copie (3) de toto.txt
    ficname=Copie de toto.txt
    ficname=toto.txt
    après la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ficname sortie=Copie (2) de toto.txt
    ficname sortie=e (2) de toto.txt
    ficname sortie=) de toto.txt
    ficname sortie= toto.txt
    crénom ........ any idea ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    T'es au courant qu'il faut la libérer la mémoire après j'espère ?

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

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par loufoque
    T'es au courant qu'il faut la libérer la mémoire après j'espère ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	for(i=0;i<NbFiles;i++)
    		free(p_ListeFichiers[i]);
     
    	free(p_ListeFichiers);
    	free(p_Chemin);
    j'ai bon ? Mais bon ça intervient bien après l'appel et le retour de ExploreRep vu que j'ai besoin de l_ListeFichiers et donc de son homologue local dans ExploreRep p_ListeFichiers

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    pas d'idées .........

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p_ListeFichiers = malloc(sizeof(char*)*CST_NB_Fichiers_A_Lire25);
    Je suis pas sur mais cela crée un objet local à la fonction qui est forcément détruit à sa sortie.

    En fait cet objet court-circuite p_ListeFichiers passé en parametre.

    Le malloc doit se faire avant l'appel de la fonction.

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Attention :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *foo(void)
    {
      char *tmp = malloc(10);
      return tmp;
    }
    tmp est une variable locale à la fonction foo.
    Sauf que l'on retourne sa valeur, qui est une adresse valide sur le tas. Donc tmp est bien détruite au sortir de la fonction mais sa valeur reste elle valide.
    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *bad_fonc(void)
    {
       char tmp[256];
       ..........
       return tmp;
    }
    Ici la valeur retournée n'est plus valide au sortir de la fonction, puisque tmp est une variable locale à cette fonction (son adresse est une adresse de la pile d'exécution) , donc le contenu peut-être détruit (ou non d'ailleurs) dans la suite de l'exécution du programme.

  11. #11
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TmpNb = ExploreRep(l_Repertoire_Principal,&l_ListeFichiers); 
       //boucle pour controle en DEBUG 
       for(i=0;i<TmpNb;i++) 
       printf("ficname sortie=%s\n",&l_ListeFichiers[i]);
    non :
    printf("ficname sortie=%s\n"l_ListeFichiers[i]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     while(read = readdir(rep)) 
       { 
          NbFiles++; 
          l_indiceFichier=NbFiles-1; 
          p_ListeFichiers[l_indiceFichier]=malloc(255); 
          strcpy(p_ListeFichiers[l_indiceFichier],read->d_name); 
       }
    Non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(read = readdir(rep)) 
       { 
          NbFiles++; 
          l_indiceFichier=NbFiles-1; 
          (*p_ListeFichiers)[l_indiceFichier]=malloc(255); 
          strcpy((*p_ListeFichiers)[l_indiceFichier],read->d_name); 
       }

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    J'ai pas trop lu les conversations precedentes, mais ton problème reside effectivement sur le malloc que tu effectue à l'interieur.
    Essaye le prototype suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char **  ExploreRep(char *, char ** );
    Tu pourras recuperer ainsi la bonne adresse

Discussions similaires

  1. [VB6]Comment puis-je passer une ComboBox en argument?
    Par Xan dans le forum VB 6 et antérieur
    Réponses: 20
    Dernier message: 26/02/2007, 15h03
  2. passer un tableau d'arguments à un thread
    Par madimane dans le forum POSIX
    Réponses: 5
    Dernier message: 14/04/2006, 07h08
  3. Comment passer une fonction en argument
    Par Pades75 dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 10h34
  4. Réponses: 10
    Dernier message: 03/03/2005, 13h36
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41

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