Flux rss
Collection CommentÇaMarche.net
Rechercher : dans
Par :

[C++]erreur de segmentation

odimax, le lundi 27 novembre 2006 à 18:51:00 
 Signaler ce message aux modérateurs

Bonjour,
alors moi je suis en licence informatique,
on doit faire un tp qui consiste à faire la verifictaion pour l'ensemble des fichiers du sous arbre ayan pour racine le repertoire d'accueil.
Mon probleme se situe au niveau de l'execution:
on me dit erreur de segmentation mais j'ai essayé de verifier tous mes pointeurs et je ne vois tjs pas le pb...si quelqu'un pourrait maider avan merecredi 29 nov midi svp
Voici mon code:

#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;
}




}

Configuration: windows ou linux

1

kilian, le lundi 27 novembre 2006 à 20:18:02

Salut,

Je t'avouerais que je testerais bien le code, mais là c'est illisible.
Sans indentation c'est pas débuggable.
Tu devrais reposter ton code en utilisant les balises code
là les indentations seront là car ces balises conservent les espaces et tabulations.

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

2

kilian, le lundi 27 novembre 2006 à 20:28:42

Bon, grâce à gdb, j'ai pu découvir un ptit truc.
Dans ton main, tu déclares un pointeur de vector de type File:

vector<File> *tab;

Mais tu ne lui donnes aucune instance avec new.
Ensuite plus bas tu fais:
(*tab).assign(0,fish);

Tu veux assigner une structure fichier à un vector mais tu n'alloues aucune aucune place à ce vector, tab n'est l'instance de rien du tout.

Après avoir corrigé l'erreur, ton programme à l'air de bien marcher.
..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

3

odimax, le lundi 27 novembre 2006 à 20:43:10

#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;
}




} 

Répondre à odimax

4

kilian, le lundi 27 novembre 2006 à 20:47:02

Ben oui tu as utilisé les balises code mais ton code n'est toujours pas indenté ;-)
Bon, c'est pas, grave, relis au dessus, j'ai répondu pour ton erreur de segmentation....

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

5

odimax, le lundi 27 novembre 2006 à 21:18:43

Dsl pour le code il est pas tré lisible...le pb c ke g pas linux chez moi et jpeu po compiler...tu as compiler et executer le prog(apres t modif)?ca marche?

Répondre à odimax

6

kilian, le lundi 27 novembre 2006 à 21:24:59

Oui ça marche. Mais je ne peux pas t'assurer que tout marche comme il faut, et que le prog fait tout ce qu'il a à faire.
Il ya des compilateurs c++ libres sous windows comme dev c++:
http://www.google.fr/search?hl=fr&q=dev+c%2B%2B&btnG

..et le...le...enfin, non parce c'est...ya...quand...bah tu sais là le...

Répondre à kilian

7

odimax, le lundi 27 novembre 2006 à 21:32:58

Merci bcp pour ton aide, ct tout bete en raison ms merci encor:!je verifieré ca demin en salle de tp!

Répondre à odimax

8

 odimax, le mardi 28 novembre 2006 à 18:16:29

Merci pour laide ke vs mavez apporté, le prog marche nickel!!a biento!

Répondre à odimax
[visual C++] erreur icone Bonjour!!!! Je suis en train de créer une application sur visual c++ express 2005 et j'ai voulu mettre une icone pour la fenetre principale à côté du titre de la form mais j'ai une erreur lorsque je lance l'application : Une exception non gérée du... www.commentcamarche.net/forum/affich-2716593-visual-c-erreur-icone
Windows live messenger (c.erreur 80048820) (Résolu) Salut, j'ai un petit problème avec mon msn, je travaille sur windows live messanger ( la derinière version) le problème c'est que lorsque j'éssaie d'ouvrir ma session le messenger me signale qu'il est impossible de me connecter, après il me propose... www.commentcamarche.net/forum/affich-3410022-windows-live-messenger-c-erreur-80048820
[Visual C++] erreur à la compilation (Résolu) Bonjour, J'utilise actuellement le code dont le lien est le suivant : http://www.codeproject.com/audio/ExtrtactAVIFrames.asp qui permet d'extraire les images d'une vidéo et de les transformer en bitmap. Voici les erreurs à la compilation que je ne... www.commentcamarche.net/forum/affich-2098813-visual-c-erreur-a-la-compilation
La compilation et les modules en C et en C++Cet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du... www.commentcamarche.net/faq/sujet-14440-la-compilation-et-les-modules-en-c-et-en-c
MSN - Erreur de connexion 80048439Erreur 80048439 Avant toute modification sur votre système, vérifiez l'état des serveurs MSN Messenger, afin de déterminer si le problème ne vient pas de là : http://messenger.msn.com/Status.aspx?mkt=fr-fr Il peut également s'agir d'un problème... www.commentcamarche.net/faq/sujet-6123-msn-erreur-de-connexion-80048439
Gestion des erreursPar défaut, en Pascal, la gestion des erreurs est assurée par le compilateur. C’est pour cette raison que le programme s’arrête en affichant un message commençant par Runtime error suivi par le numéro de l’erreur … Alors si le programmeur désire... www.commentcamarche.net/faq/sujet-7546-gestion-des-erreurs
Microsoft Visual C++ Runtime LibraryBonjour à tous et merci à ceux qui liront ce message. Je suis sous Windows 2000. Lorsque je joue à un jeu (CS, AOM, NWN), le message d'erreur suivant s'affiche au début de la partie : Microsoft Visual C++ Runtime Library Runtime error! program : « le... www.commentcamarche.net/forum/affich-212424-microsoft-visual-c-runtime-library
[Visual C++]Erreur à l'execution avec des dllsalut, j'ai un probleme sous visual(je decouvre ce logiciel!) mon programme compil mais lorsque je veux l'executer la console s'affiche puis disparait quasi directement et j'ai ensuite un tas d'erreur du genre : 'joao.exe' : Chargé... www.commentcamarche.net/forum/affich-2723991-visual-c-erreur-a-l-execution-avec-des-dll
Visual C++ - Erreur C1083Bonjour tout le monde ! Je suis en train de faire une DLL sous Visual C++. J'ai donc créer mon fichier .c via Win32 DLL. Cette dernière appelle une librairie "commonDLL.h" qui appelle elle-même d'autres librairies. Toutes ces librairies sont utilisées... www.commentcamarche.net/forum/affich-2699855-visual-c-erreur-c1083