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 :

gestion de File C++


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut gestion de File C++
    Bonjour à tous ,


    j'utilise une File dans mon code C++.
    quelqu'un me propose une solution pour copier les élements d'une file dans une autre .
    merci d'avance pour l'aide .

  2. #2
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Bonjour,

    je pense ce que cela pourra t'aider

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    voici le fichier File.cc
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    #include <stdio.h>
    #include "File.h"
    	File::File ( int taille )
    	// Constructeur
    		{
    		window = new int [taille];
    		}
    	File::~File ()
    		{
    		delete []window;
    		}
    		// destructeur
    	void File::ViderFile ()
    		{
    		for(int i=0;i<taille;i++)
    			{
    				window[i]=0;
    			}
    		}
    	void File::Enfiler ( const int & element )
    		{
    			if (FilePleine())
    				int x = Defiler();
    			int indice = dernier_indice();
    			window[indice] = element;
     
    		}
    	int File::Defiler ()
    		{
    			if ( FileVide() )
    				printf("erreur la file vide");
    			int x = window[0];
    			Decaler_tableau();
    			return x ;
     
    		}
    	int File::PremierElement () const
    		{
    			if ( FileVide() ) 
    				printf("erreur la file vide");
    			return window[0];
    		}
    	bool File::FileVide () const
    		{
    			int nbre_element = 0 ;
    			for (int i=0;i<taille;i++)
    				if (window[i]==0)
    				{
    					nbre_element ++;
    				}
    			if (nbre_element == taille )
    				return 1;
    			else 
    				return 0;
    		}
    	bool File::FilePleine () const
    	 	{
    		int nbre_element = 0 ;
    			for (int i=0;i<taille;i++)
    				if (window[i]!=0)
    				{
    					nbre_element ++;
    				}
    			if (nbre_element == taille )
    				return 1;
    			else 
    				return 0;
    		}
    	int File::get_element(int position)
    		{
    			return window[position];
    		}
    	int File::dernier_indice()
    		{
    			for (int i=0;i<taille;i++)
    				if (window[i]==0)
    				{
    					return i;
    					break;
    				}
    		}
    	void File::Decaler_tableau()
    		{	
    			for (int i=0;i<taille;i++)
    				window[i]=window[i+1];
    		}
    	File File::copie_file()
    		{
     
    			File copie = File(taille);
    			int i=0 ;
    			for  (int i=0;i<taille;i++)
    			{
    				copie.Enfiler(window[i]);
    			}
    			return copie;
    		}
    le code génère une erreur lorsque j'appelle la méthode Enfiler()
    merci de m'aider à trouver la source d'erreur .

  4. #4
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    Citation Envoyé par Tooxx Voir le message
    oui , j'ai corrigé , merci

  6. #6
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Tu as une erreur de segmentation dans la fonction decaler_tableau() qui est appelée par défiler()

    Je ne peux que te conseillais d'utiliser les conteneurs de la STL

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    Citation Envoyé par Tooxx Voir le message
    Tu as une erreur de segmentation dans la fonction decaler_tableau() qui est appelée par défiler()

    Je ne peux que te conseillais d'utiliser les conteneurs de la STL
    oui c'est ça , errreur de segmentation ,pourquoi c'est à cause de la méthode decaler_tableau() ?? comment je peux résoudre ce pb ?
    merci d'avance

  8. #8
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Tu sors de ton tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	void File::Decaler_tableau()
    		{	
    			for (int i=0;i<taille;i++)
    				window[i]=window[i+1]; //bim
    		}
    Les bornes d'un tableau c'est entre 0 et taille -1 hors là à la dernière itération...

  9. #9
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Par défaut
    Salut,

    à première vue, il y a un problème d'indice en fin de cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    void File::Decaler_tableau()
    {	
    	for (int i=0;i<taille;i++)
    		window[i]=window[i+1];
    }
    je la limiterais à taille-1 , mais je n'ai pas vu le reste du code

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	void File::Decaler_tableau()
    		{	
    			for (int i=1;i<taille;i++)
    				window[i-1]=window[i]; 
    		}
    et maintenant , ça va ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    oh lala !!
    maintenant je trouve une autre erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *** glibc detected *** ns: double free or corruption (fasttop): 0x095e2fe8 ***

  12. #12
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Si ca plante pu oui

    mais oui en tout cas il n'y a pu d'erreurs ici

    edit : montre ton header

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    Citation Envoyé par Tooxx Voir le message
    Si ca plante pu oui

    mais oui en tout cas il n'y a pu d'erreurs ici

    edit : montre ton header
    j'ai fait recherche sur internet.
    j'ai vu que si on exécute cette commande "export MALLOC_CHECK_=0" avant d'exécuter le programme , ça marche !!!!!!!

  14. #14
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Si la variable MALLOC_CHECK_ vaut zéro, toutes les corruptions du tas détectées sont ignorées silencieusement
    Donc après je sais pas si c'est vraiment propre ta façon de procéder.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    Citation Envoyé par Tooxx Voir le message
    Donc après je sais pas si c'est vraiment propre ta façon de procéder.
    ça ne marche pas tout le temps !!!!!!!!!!!!!!!! !!
    donc voyons le fichier File.h
    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
     
    // fichier File.h
    // déclaration de la classe File
    #ifndef FILE_H
    #define FILE_H
    //#include "ant_pkt.h"
    const int Taille_de_File = 50 ;
    class File
    {
    	public :
    		File ( int taille = Taille_de_File ) ; // Constructeur
    		~File () ; // destructeur
    		void ViderFile ();
    		void Enfiler ( const int & );
    		int Defiler () ;
    		int PremierElement () const;
    		bool FileVide () const;
    		bool FilePleine () const;
    		int get_element(int position);
    		int dernier_indice();
    		void Decaler_tableau();
    		File copie_file ();
     
    	private :
    		int taille;
    		int *window;// tableau contenant les éléments de la file
    		};
    #endif

  16. #16
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Je dirai bien que tu delete quelque chose qui a déjà été delete ou quelque chose dans cette idée.

    Donc si c'est bien a cause de ca que cette erreur est généré montre nous ton main()

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 37
    Par défaut
    j'ai pas de main() , en fait je travaille avec le simulateur ns2 , j'avais juste besoin d'une file dans protocole que je suis entrain d'implémenter .

  18. #18
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Par défaut
    je ne vois pas l'origine du double free à partir du header, peut être un objet de type File a été alloué dynamiquement et détruit plusieurs fois

    il y a peut être un cas (peu probable mais bon) : la variable membre taille n'est initialisée nulle part

    donc si on instancie un objet de type File et qu'on le duplique (File::copie_file()) , je crains une alloc qui ne passera pas ( taille = ?)
    en plus celle fonction renvoie par valeur et le copy-constructor (généré par le compilo) dans ce genre de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	File newFile = firstFile.copie_file();
    fera que firstFile et newFile pointeront vers la meme adresse window, et là le plantage est assuré au delete des deux

    après tout cela n'est qu'hypothèses, si c'est avéré :
    remplate copie_file par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const File& operator=(const File& source)
    {
    	taille = source.taille;
                 delete[] window;  
    	window = new int [taille];
    	for (int i=0;i<taille;i++)
    		window[i]=source.window[i];
     
    	return *this;
    }

  19. #19
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Par défaut
    les fonctions qui utilisent taille sont à observer également,

    à moins que l'initialisation de File::taille me soit passée sous le nez

  20. #20
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Si la variable MALLOC_CHECK_ vaut zéro, toutes les corruptions du tas détectées sont ignorées silencieusement
    Citation Envoyé par Tooxx Voir le message
    Donc après je sais pas si c'est vraiment propre ta façon de procéder.
    Non, ce n'est évidemment pas la bonne façon de procéder. On peut mettre les balayures sous le tapis quand on balaye une pièce, mais si on fait ça, on aura pas nettoyé (l'objectif ne sera pas atteint).

    Citation Envoyé par Tooxx Voir le message
    Je ne peux que te conseiller d'utiliser les conteneurs de la STL
    C'est effectivement la bonne façon de procéder.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Gestion de file d attente
    Par juzii dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 03/08/2009, 16h05
  2. gestion de files
    Par rems033 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/08/2007, 15h20
  3. [socket] Gestion de file
    Par sylk974 dans le forum Développement
    Réponses: 1
    Dernier message: 09/03/2007, 17h33
  4. Gestion de files d'attente
    Par bounnitcharaf dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 20/09/2006, 18h34

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