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 :

Erreur de segmentation


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Par défaut Erreur de segmentation
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    #include <cstdlib>
    #include <iostream>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <string>
    #include <vector>
    #include <errno.h>
    #include <fcntl.h>
    #include <sstream>
     
     
    using namespace std;
     
     
    extern int errno;
    struct File{ int inum;
    	 int nblinks;
    	     string name;
    	};
     
    void afficheTab (vector<File> *tab)
     
    /*
    Permet d'afficher le résultat de l'excécution du programme
    */
    {
    	int fichOui = 0; //Nombre de fichiers intègres
    	int fichNon = 0; //Nombre de fichiers corrompus
    	bool b=false; // test d'affichage
    	for(int i=0 ; i<(*tab).size();i++) //Parcours de la liste des fichiers traités
    	{
    		if (((*tab)[i]).nblinks>1) // si tous les liens du fichier n'ont pas été trouvés
    		{
    			if (!b) //test d'affichage
    			{
    				cout<<"Liste des fichiers en danger :"<<endl;
    				b=true;
    			}
    			cout<<"\tnum : "<<(*tab)[i].inum<<", nom : "<<(*tab)[i].name<<", liens : "<<(*tab)[i].nblinks<<endl; // On affiche les fichiers problématiques
    			fichNon++; // on incrémente le nombre de fichiers corrompus
    		}
    		else //si tous les liens du fichier ont étaient atteinds
    		{
    			fichOui++; // incrémentation du nombre de fichiers intègres
    		}
    	}
    	cout<<"\nBilan de l'excécution : "<<endl;
    	cout<<"Nombre de fichiers avec liens durs traités : "<<fichOui+fichNon<<"."<<endl;
    	cout<<"\tdont :"<<endl;
    	cout<<"\t\t"<<fichOui<<" fichiers intègres."<<endl;
    	cout<<"\t\t"<<fichNon<<" fichiers à problème."<<endl;
    }
     
    void traiteFichier (int num , int nblien ,char* temp, vector<File> *tab)
    /*
    traite un fichier possèdant plus de deux liens.
    */
    {
     
    	int indiceFichier=0; //Indice du fichier recherché
    	bool b=false;
     
    	for (int i=0 ;( i<(*tab).size() and !b) ; i++) //Parcours de la liste des fichiers
    	{
     
    		b = ((*tab)[i].inum == num); // Si le fichier possède le même numéro d'inode que le paramètre num.
    		indiceFichier=i; // on sauvegarde l'indice du fichier dans le vecteur
    	}
    	if (b) //Si le fichier existe déja dans le tableau
    	{
    		(*tab)[indiceFichier].nblinks = (*tab)[indiceFichier].nblinks - 1; //On décrémente le nombre de liens à trouver
     
    	}
    	else // si le ficher n'est pas dans la liste
    	{
     
    struct stat istique;
    	int er=stat(temp,&istique);
     
    	struct File fic;
    		fic.inum=istique.st_ino;
    		fic.nblinks=istique.st_nlink;
    		fic.name=temp;
     
     
     
     
     
     
    		(*tab).push_back(fic);// on ajoute de fichier dans la liste		
     
     
     
    	}
    }
     
     
     
    bool dejaVu (int num , vector<int> *Vu)
    {
    	bool b = false;
    	for (int i = 0 ; (i<(*Vu).size() and !b); i++ )
    	{
    		b = (num == (*Vu)[i]);
    	}
    	return b;
    }
     
     
    bool verificationArborescence (char s[],vector<int> *Vu, vector<File> *tab)
    /*
    Parcours récursif de l'arborescence dans le but de vérifier l'intégrité des fichiers
    */
    {
    	DIR *rep =  opendir(s); //ouverture du dossier passé en paramètre
    	if (rep == NULL) // Si l'ouverture a échouée
    	{	
    		cout<<"Erreur ouverture du dossier : '"<<s<<"'\n\tMessage d'erreur : "<<strerror(errno)<<"."<<endl; // message d'erreur
    	}
    	else //si l'ouverture s'est bien passée
    	{
    		cout<<"Ouverture du dossier : '"<<s<<"'"<<endl;
    		struct dirent *repertoire; // on récupère une structure pour parcourir le répertoire
     
    		repertoire = readdir(rep); //lecture du premier fichier
    		struct stat inode;  //déclaration d'une structure d'inode pour traiter le fichier
    		struct stat inode2;
    		while ((repertoire != NULL)) //tant que le répertoire possède des fichiers
    		{
    			string nomFichier =s; //construction du chemin absolue du fichier
    			nomFichier=nomFichier+'/'; // rajout du carctère '/' au chemin du répertoire
    			nomFichier = nomFichier+((*repertoire).d_name); // concaténation du nom du fichier
    			if ( ((*repertoire).d_name)[0]!='.' ) // exclu les fichiers '.' et '..'
    			{
    				char fichier[nomFichier.size()+1]; // déclaration d'un tableau de caractère pour pouvoir utiliser stat()
    				strncpy( fichier, nomFichier.c_str(), nomFichier.size()+1 ); // Copie du nom de fichier dans le tableau de caractère
     
    				int resultatStat = stat (fichier, &inode); //apel de la fonction stat()
     
    				if (resultatStat == 0) // si l'appel système s'est bien passé
    				{
     
    					int resultatLstat = lstat (fichier, &inode2);
     
    					if (resultatLstat==0 and S_ISLNK(inode2.st_mode))
    					{
     
    						char q[500];
    						for (int i=0 ; i<500 ; i++)
    						{
    							q[i]='^';
    						}
    						char *qt = q;
    						readlink(fichier, qt, 500);
    						string ss=s+'/';
    						int j=0;
    						while (qt[j]!='^')
    						{
    							ss = ss+qt[j];
    							j++;
    						}
    						char fich[ss.size()+1]; 
    						strncpy( fich, ss.c_str(), ss.size()+1 ); 
     
    						if (S_ISDIR(inode.st_mode) and !dejaVu(inode.st_ino , Vu))
    						{
    							(*Vu).push_back(inode.st_ino);
    							verificationArborescence (fich, Vu, tab);
    						}
    					}
    					else if ( S_ISDIR(inode.st_mode) and !dejaVu(inode.st_ino , Vu))
    					{
    						(*Vu).push_back(inode.st_ino);
    						verificationArborescence (fichier,Vu,tab);	
    					}
    					else if (!S_ISDIR(inode.st_mode))
    					{
    						if (inode.st_nlink>1)
    						{
    							traiteFichier(inode.st_ino, inode.st_nlink , fichier , tab);
    						}
    					}
    				}
    				else
    				{	
    					cout<<"Erreur fonction stat() sur le fichier :  '"<<fichier<<"'\n\tMessage d'erreur : vous n'avez pas les droits de passage sur l'un des dossiers du chemin."<<endl;
     
    				}
    			}
     
    			repertoire = readdir(rep);
    		}
     
    		int rclose = closedir(rep);
    		if (rclose!=0)
    		{
    			cout<<"La fermeture s'est mal passée"<<endl;
     
    		}
    	}
     
    }
     
     
     
    int main (int argc, char *argv[])
    {
    	if (argc >1)
    	{
    		struct stat inode;
    		int r = stat ("toto.txt", &inode);
    		int i =0;
    		vector<int> *Vu = new vector<int>;
    		vector<File> *tab;
    		struct File fish;
    			fish.inum=0;
    			fish.nblinks=0;
    			fish.name="";
    		(*Vu).assign(0,0);
    		(*tab).assign(0,fish);
     
    		cout<<"Trace d'excécution :"<<endl;
    		verificationArborescence(argv[1], Vu, tab);
    		afficheTab(tab);
    	}
    	else
    	{
    		cout<< "Tp necessite le passage en paramètre du chemin de la racine de l'arbre à vérifier"<<endl;
    	}
     
     
     
     
    }
    quand je le compile ça affiche une erreur de segmanetation

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Tu as pensé à utiliser un debugguer pour voir où se trouvait la ligne incriminée ?


    quand je le compile ça affiche une erreur de segmanetation
    As, c'est quand tu compiles... C'est ton compilateur qui fait une erreur de segmentation, c'est bizarre ça

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ma boule de cristal est en forme aujourd'hui. Deux erreurs (nul doute qu'il y en a beaucoup plus) :

    char* + char = char* décalé (et pointant peut-être n'importe où), et non concaténé. Ceci par contre sera correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string ss = s;
    ss += '/';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<File> *tab;
    ...
    (*tab).assign(0,fish);
    tab pointe n'importe où. Pourquoi diable utiliser un pointeur sur vector ? C'est du contre-emploi et ça réintroduit des erreurs potentielles qu'il élimine.

    Tu devrais aussi apprendre à utiliser ton debogueurn ça pourrait t'être beaucoup plus utile que nos boules de cristal

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Au passage, je signale des erreurs de compilation :

    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
    g++ -Wall -W -pedantic test.cpp
    test.cpp:17: error: declaration of 'int* __errno_location()' throws different exceptions
    /usr/include/bits/errno.h:43: error: from previous declaration 'int* __errno_location() throw ()'
    test.cpp: In function 'void afficheTab(std::vector<File, std::allocator<File> >*)':
    test.cpp:32: warning: comparison between signed and unsigned integer expressionstest.cpp: In function 'void traiteFichier(int, int, char*, std::vector<File, std::allocator<File> >*)':
    test.cpp:65: warning: comparison between signed and unsigned integer expressionstest.cpp:80: warning: unused variable 'er'
    test.cpp: At global scope:
    test.cpp:56: warning: unused parameter 'nblien'
    test.cpp: In function 'bool dejaVu(int, std::vector<int, std::allocator<int> >*)':
    test.cpp:104: warning: comparison between signed and unsigned integer expressions
    test.cpp: In function 'bool verificationArborescence(char*, std::vector<int, std::allocator<int> >*, std::vector<File, std::allocator<File> >*)':
    test.cpp:137: error: ISO C++ forbids variable-size array 'fichier'
    test.cpp:164: error: ISO C++ forbids variable-size array 'fich'
    test.cpp: In function 'int main(int, char**)':
    test.cpp:213: warning: unused variable 'r'
    test.cpp:214: warning: unused variable 'i'
    test.cpp: In function 'bool verificationArborescence(char*, std::vector<int, std::allocator<int> >*, std::vector<File, std::allocator<File> >*)':
    test.cpp:204: warning: control reaches end of non-void function

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2
    Par défaut erreur segmentation
    bonjour je suis avec jamidoquai en binome sur ce tp ke lon ns a donnéa faire avan mercredi midi..pour le string ss=s+'/' le pb a deja été reglé merci kan mm pour linfo!le tp consiste a verifier tous les fichiers (avec les liens durs et symboliques) ds un sous arbre.merci d'avance pour laide ke vs ns apporterez, c'est tré importan pour la note finale!

  6. #6
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut
    fais quand meme attention a l'orthographe ! et la pizza et le coca light, c'est pour qui ?

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2
    Par défaut reponse au pb
    bonjour, tout le monde...ns avons finalemen trouver le pb...il se situe au niveau du main et de la declaration du vecteur tab il faut rajouter vector<File> *tab= new vector<File>;
    et voila le pb est resolu tt fonctionne correctemen!merci a tt le monde pour leur aide!et a biento!

  8. #8
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    1) En attendant, pourquoi allouer un pointeur sur le tas alors qu'il suffit de le mettre sur la pile ?

    2) Documenter votre code et un peu de nettoyage et clareté seraient vraiment les bienvenus.

    3) Actuellement le français est la langue utilisée dans tous les pays francophones, ce n'est pas encore le mode SMS.

    Merci

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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