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

Windows Discussion :

Problème avec la fonction findfirst ()


Sujet :

Windows

  1. #1
    Membre régulier

    Profil pro
    none
    Inscrit en
    Août 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Août 2002
    Messages : 80
    Points : 96
    Points
    96
    Par défaut [Résolu] Problème avec la fonction findfirst ()
    Bonjour;

    Je tente déséspérement de lister le contenu d'un dossier avec la fonction findfisrt() mais a chaque appel, ma variable contenant le chemin est tronqué !!??

    Mon projet ce compose comme suit :

    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
    //Main.cpp
    
    #include <stdio.h>
    #include <string.h>
    
    #include "Head.hpp"
    
    
    void main&#40; int argc, char **argv &#41;
    &#123;
    	 /* Program entry point */
    	 char * path = new char&#40;256&#41;;
    	 strcpy&#40;path, argv&#91;1&#93;&#41;; //Ici je récupère le chemin eg &#58; D&#58;\structure
    	 strcat&#40;path, "\\*"&#41;; //Ajout de la chaine "\*" 
    	 affiche&#40;path&#41;;
    
    &#125;
    Head.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef H_Head
    #define H_Head
    
    void affiche&#40;char *&#41;;
    
    #endif
    et sa définition :
    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
    #include <dir.h>
    #include <stdio.h>
    #include "head.hpp"
    
    void affiche&#40;char * source&#41;&#123;
    int ret=0;
    ffblk * s = new ffblk;
    
    // Ici source = d&#58;\structure\*, ce qui est tout a fait normal
    
    	ret = findfirst&#40;source, s, FA_DIREC&#41;;
    //aprés l'appel a findFirst&#40;&#41; source = d&#58;\structure + des caractère ascii
    // ret = -1 ce qui indique une erreur
    
    //la boucle while ne sera jamais exécuté
    	while&#40;!ret&#41;&#123;
    		printf&#40;"\n %s - %d", s->ff_name, ret&#41;;
    		findnext&#40;s&#41;;
    	&#125;;
    &#125;;
    Voilà mon problème. Je pourrais faire appel à la fonction findfirst des Apis mais je souhaite comprendre le pourquoi du problème.

    merci.

    Ps : System Xp Pro compilateur BCC5.5

    angI.

  2. #2
    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
    Le problème vient peut-être que tu utilises des fonctions DOS, et que le DOS de XP Pro n'est pas un vrai DOS je crois!
    Autre problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //la boucle while ne sera jamais exécuté
       while&#40;!ret&#41;&#123;
          printf&#40;"\n %s - %d", s->ff_name, ret&#41;;
         ret =  findnext&#40;s&#41;; <===
       &#125;;
    [edit] Au fait, tu ne testes pas le retour de new, il serait aussi prudent de le faire
    [/edit]
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Points : 73
    Points
    73
    Par défaut
    Bonjour Angelico,

    D'abord, l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * path = new char&#40;256&#41;;
    alloue de l'espace pour un seul caractère et l'initialise avec la valeur 256 (ce qui est impossible puisqu'un caractère ne peut avoir une valeur plus grande que 255; il prendra probablement la valeur zéro). Ce n'est pas ce que tu veux faire: tu veux allouer un tableau de 256 caractères. Alors c'est comme ça qu'il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * path = new char&#91;256&#93;;
    De plus, ton programme devrait restaurer la mémoire avec delete[]. Une autre façon plus simple est d'utiliser un tableau sur la pile (allocation et désallocation automatiques):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char  path&#91;256&#93;;
    Ensuite, ta boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //la boucle while ne sera jamais exécuté 
       while&#40;!ret&#41;&#123; 
          printf&#40;"\n %s - %d", s->ff_name, ret&#41;; 
          findnext&#40;s&#41;; 
       &#125;;
    ne se terminera jamais puisque la valeur de ret ne change pas. Aussi, le ; qui suit l'accolade fermante est superflu. Il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //la boucle while ne sera jamais exécuté 
       while&#40;!ret&#41;&#123; 
          printf&#40;"\n %s - %d", s->ff_name, ret&#41;; 
          ret = findnext&#40;s&#41;; 
       &#125;
    Ici aussi la variable s est allouée dynamiquement sans être libérée:
    Tu peux faire:
    Mais alors, comme findfirst() et findnext() demandent un pointeur sur s, tu vas leur donner &s plutôt que s.

    Aussi, il faut appeler findclose() lorsque tu as terminé de findfirst() et findnext().

  4. #4
    Membre régulier

    Profil pro
    none
    Inscrit en
    Août 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Août 2002
    Messages : 80
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    D'abord, l'instruction:
    Code:
    char * path = new char(256);

    alloue de l'espace pour un seul caractère et l'initialise avec la valeur 256 (ce qui est impossible puisqu'un caractère ne peut avoir une valeur plus grande que 255; il prendra probablement la valeur zéro). Ce n'est pas ce que tu veux faire: tu veux allouer un tableau de 256 caractères. Alors c'est comme ça qu'il faut faire:
    Code:
    char * path = new char[256];
    Tout est dit

    ça fait 2 jours que je code comme un fou et a chaque allocation de Tableau je rencontrais que des problèmes !! Sur que ca va fonctionnait maintenant.
    Pour ce qui est de la libération des pointeurs, je les ai juste homis dans mon exemple, sincèrement désolé.

    Encore merci pour votre aide.

    angI.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 21/02/2005, 17h20
  2. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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