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 :

Comportement etrange boucle while


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    septembre 2013
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : septembre 2013
    Messages : 230
    Points : 553
    Points
    553
    Par défaut Comportement etrange boucle while
    Salut,
    Dans une bouche while je cherche a récupérer la liste de fichiers se trouvant dans un répertoire précis. Pour cela j’exécute toutes les n secondes une fonction puis un sleep. Ca marche presque bien, sauf qu'en affichant les résultats je remarque un comportement étrange : on dirait qu'il y a deux vectors. Je m'explique. C'est a dire qu'en affichant la size du vector cette dernière alterne une fois sur deux exactement. Le vector n'est pas remplacé, il est dupliqué. Mais regroupees ensemble, les information des deux vectors sont completes et correctes !


    Exemple, quand j'ajoute un fichier dans le repertoire ca peut etre n'importe lequel des deux qui le prend en compte. Voici le resultat. Bon en l'occurrence le second est a zero parce que j'ai pris la capture sans rien ajouter.



    Le 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
     
            std::vector<Picture> vecPictures(0);
    	tstring directory = _T("C:\\temp\\*");
     
    	while(true){
    		capturePictures(vecPictures, directory);
    		for(size_t i =0; i < vecPictures.size(); i++ ){
    			tcout << vecPictures[i] <<std::endl;
    		}
    		std::cout << "Taille du vecteur : ";
    		std::cout << vecPictures.size() << std::endl;
    		std::cout << "" << std::endl;
    		std::cout.flush();
    		::Sleep(1000);
    	}

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    décembre 2011
    Messages
    9 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 9 014
    Points : 22 976
    Points
    22 976
    Par défaut
    Bonjour,

    Il faudrait nous donner le code de capturePictures(vecPictures, directory); pour qu'on puisse t'aider.

  3. #3
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    septembre 2013
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : septembre 2013
    Messages : 230
    Points : 553
    Points
    553
    Par défaut
    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
    void capturePictures(std::vector<Picture> &vecPicsOld, const tstring &dir){
     
    	HANDLE hFind = INVALID_HANDLE_VALUE;
    	WIN32_FIND_DATA ffd ;
     
    	std::vector <Picture> vecPics ;
    	std::wstring drawString = L" Draw.";
     
    	//std::string tmpFilename;
    	//std::stringstream strstream;
     
     
    	hFind = FindFirstFile(dir.data (), &ffd) ;
    	if (hFind == INVALID_HANDLE_VALUE) {
            // Return an error or throw an exception
    		std::cout << "Error : INVALID_HANDLE_VALUE" << std::endl;
            return ;
        }
     
    	do{
    		bool isDirectory = ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
    		//strstream << ffd.cFileName;
    		//strstream >> tmpFilename;
    		std::wstring ws(ffd.cFileName);
     
    		if(!isDirectory && ws.rfind(drawString) == std::string::npos){
    			Picture pic(ffd.cFileName, ffd.ftCreationTime);
     
    			if(std::find(vecPicsOld.begin(), vecPicsOld.end(), pic) == vecPicsOld.end()){
    				vecPics.push_back(pic);
    			}
     
    		}
     
     
     
     
    	}while(::FindNextFile (hFind, &ffd)!= NULL);
    	::FindClose(hFind);
     
    	// This keeps the vector fresh so it won't build up old values.
        std::swap (vecPics, vecPicsOld);
     
     
    }

  4. #4
    Membre émérite

    Inscrit en
    mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    Dans le main Tu ne clear pas ton vecteur vecPictures après utilisation, donc la deuxième fois que tu appelle capturePictures le vecteur contient déjà la liste des fichiers du répertoire temp, donc tous les std::find vont réussir et le vecteur construit dans capturePictures sera vide.

    Un conseil remplace l'interface de capturePictures par std::vector<Picture> capturePictures(const tstring &dir) ça évitera des erreurs de ce genre.

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2008
    Messages : 1 505
    Points : 2 798
    Points
    2 798
    Par défaut
    En fait c’est surtout le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(std::find(vecPicsOld.begin(), vecPicsOld.end(), pic) == vecPicsOld.end()){
        vecPics.push_back(pic);
    }
    Qui est étrange.

    Mais de manière plus générale : pourquoi avoir deux vector ? Un seul suffit, après, tu peux décider de le passer en valeur de retour, ou de le garder en paramètre (il y a les deux écoles là-dessus, les deux approches ont leurs avantages et inconvénients), dans le dernier cas la question se pose de savoir si tu le purges dans l’appelé ou l’appelant.

  6. #6
    Membre confirmé
    Profil pro
    Developpeur
    Inscrit en
    septembre 2013
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : septembre 2013
    Messages : 230
    Points : 553
    Points
    553
    Par défaut
    @Arzar

    Oui en effet. Et puis je viens de me rendre compte que je souhaitais éliminer les fichiers qui n’étaient pas présents dans le code. Tout ceci est a revoir.


    @white_tentacle
    Le test est simplement destiné a voir si une image valide est déjà répertorié dans le vector. Une image peut avoir le même nom (filename) mais avoir été écrasée. Donc c'est une nouvelle image. Mais ce bout de code va me servir a un autre endroit

    PS : Merci a vous deux

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

Discussions similaires

  1. Comportement boucle WHILE très étrange
    Par czar1983 dans le forum C
    Réponses: 18
    Dernier message: 18/06/2013, 10h43
  2. boucle while et post incrémentation
    Par tut dans le forum C++
    Réponses: 7
    Dernier message: 10/12/2004, 18h24
  3. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 23h51
  4. [langage] Comportement étrange d'une variable
    Par Spaz dans le forum Langage
    Réponses: 6
    Dernier message: 23/04/2004, 12h29
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 16h20

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