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 venue de nulle part


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Par défaut Erreur de segmentation venue de nulle part
    Bien le bonjour!

    Voilà la situation: je suis une brèle en C (voilà, ça c'est dit) et je suis en train désespérément de créer un programme pour le projet d'un pote.
    Le but, pour le moment, est de parcourir une arborescence à partir d'une adresse donnée et d'écrire les adresses absolues de tous les fichiers qui s'y trouvent dans un fichier texte.

    Et voilà, j'ai une erreur de segmentation et je sais pas d'où elle vient et où j'ai pu merder dans mon code... (c'est quoi au juste une erreur de segmentation? Ca peut venir d'où en général, c'est du à quoi?)

    Voilà 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
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <fcntl.h>
     
    #define max 1024
    #define taille 25000
     
     
    int CreerDB(char *adresserecherche, int db)
    {
    	int ecriture;
    	DIR *repertoire;
    	struct dirent *d;
    	struct stat *stbuf;
    	char adresse[max];
    	char temp[max];
    	int x=256;
    	int y=32;
    	int z=4;
     
    	//On copie le chemin de base afin de ne pas le modifier
    	strcpy(adresse, adresserecherche);
     
    	//On ouvre le dossier qui correspond
    	repertoire=opendir(adresse);
     
    	if (repertoire==NULL)
    	{
    		printf("\nErreur lors de l'ouverture du dossier : %s\n",adresse);
    		perror("opendir");
    		exit(0);
    	}
     
    	//Et on lit dans le dossier
    	while ((d=readdir(repertoire))!=NULL)
    	{
    		if (d->d_name[0]!='.')
    		{
     
    			//On crée le chemin complet du fichier/dossier
    			strcpy(temp, adresserecherche);
    			if (strcmp(temp,"/")!=0)
    			{
    				strcat(strcat(temp, "/"), d->d_name);
    			}
    			else
    			{
    				strcat(temp, d->d_name);
    			}
    			stat(temp, stbuf);
     
    			//On teste si on a un dossier avec les permissions demandées
    			if (stbuf -> st_mode == S_IFDIR)
    			{
    				printf(temp);
    				//Si oui, on relance la fonction sur ce nouveau dossier
    				CreerDB(temp, db);
    			} 
    			//Ensuite on regarde s'il y a un fichier qui correspond aux permissions demandées
    			else if (stbuf -> st_mode == S_IFREG)
    			{
    				strcat(temp,"\n");
     
    				//Et si c'est le cas, on écrit son adresse
    				if ((ecriture=write(db, temp, strlen(temp)))==-1)
    				{
    					perror("write");
    				exit(0);
    				}
    			}
    		}
    	}
     
    	//On ferme les dossiers ouverts à chaque récursion :
    	closedir(repertoire);
    }
     
     
     
    int main()
    {
    	int db;
    	char nom[max];
    	char adresserecherche[max]="/home/gourou/Desktop/Batman/MP3";
    	char **tableau;
     
     
    	//On ouvre ou crée le fichier "base_donnees"
    	if ((db=open("base_donnees", O_RDWR|O_CREAT, 0755))==-1)
    	{
    		perror("open");
    		exit(0);
    	}
     
    	//On utilise la fonction CreerDB pour placer toutes les adresses des fichiers/dossiers dans "base_donnees"
    	CreerDB (adresserecherche, db);
     
     
    	return 0;
    }
    Merci de votre attention, que le malloc soit avec vous.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Non-initialisé et passé directement à fstat().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Médinoc
    Non-initialisé et passé directement à fstat().
    Parce qu'il faudrait en fait utiliser :

    et passer le pointeur...

    Aussi :

    - Il faudrait utiliser fopen et pas open
    - Utiliser le & binaire pour tester le type du fichier et non l'égalité...

    Jc

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Par défaut
    Quelle rapidité! Merci bien, j'vais voir ça de suite ^^



    *30 secondes plus tard*

    HOURRA CA MARCHE!!!
    Thanks

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Voici une version plus propre, poses des questions si tu ne comprends pas :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
     
    #define MAX 8192
     
    int CreerDB(char *adresserecherche, FILE *db)
    {
    	DIR *repertoire, *tmprep;
    	struct dirent *d;
    	char adresse[MAX];
    	char temp[MAX];
    	int n;
     
    	//On copie le chemin de base afin de ne pas le modifier
    	strcpy(adresse, adresserecherche);
     
    	//On ouvre le dossier qui correspond
    	repertoire=opendir(adresse);
     
    	if (repertoire==NULL)
    	{
    		printf("\nErreur lors de l'ouverture du dossier : %s\n",adresse);
    		perror("opendir");
    		return EXIT_FAILURE;
    	}
     
    	//Et on lit dans le dossier
    	while ((d=readdir(repertoire))!=NULL)
    	{
    	        printf("Reading %s\n",d->d_name);
    		if (d->d_name[0]!='.')
    		{
    		    //On crée le chemin complet du fichier/dossier
    		    strcpy(temp, adresserecherche);
    		    n = strlen(temp);
    		    if(n>0)
        		    	{
        	    	    	if (temp[n-1]!='/')
        	    	    	    {
    			    strcat(strcat(temp, "/"), d->d_name);
    			    }
    		    	else
    			    {
    			    strcat(temp, d->d_name);
    			    }
    	    	    	tmprep = opendir(temp);
    		    	if(tmprep != NULL) 
    		    	    {
    			    closedir(tmprep);
    			    if(CreerDB(temp,db)==EXIT_FAILURE) 
    			    	{
    			    	closedir(repertoire);
    			    	return EXIT_FAILURE;
    			    	}
    			    }
    		    	else
    		    	    {
    			    fprintf(db,"%s\n",temp);
    			    }		
    			}
    		    else
    		    	{
    			closedir(repertoire);
    			return EXIT_FAILURE;
    			}
        		}
    	}
     
    	//On ferme les dossiers ouverts à chaque récursion :
    	closedir(repertoire);
    	return EXIT_SUCCESS;
    }
     
     
     
    int main()
    {
    	FILE* db;
    	char adresserecherche[max]="/home/gourou/Desktop/Batman/MP3";
        	int res;
     
    	//On ouvre ou crée le fichier "base_donnees"
    	if ((db=fopen("base_donnees", "w"))==NULL)
    	{
    		perror("open");
    		return EXIT_FAILURE;
    	}
     
    	//On utilise la fonction CreerDB pour placer toutes les adresses des fichiers/dossiers dans "base_donnees"
    	res = CreerDB (adresserecherche, db);
            fclose(db);
    	if( res == EXIT_SUCCESS)
    	    {
    	    printf("Succes\n");
    	    }
    	else
    	    {
        	    printf("Echec\n");
    	    } 
     
    	return res;
    }
    Jc

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Bonsoir,

    Citation Envoyé par fearyourself
    Voici une version plus propre, poses des questions si tu ne comprends pas :
    Je peux aussi ?

    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		    //On crée le chemin complet du fichier/dossier
    		    strcpy(temp, adresserecherche);
    		    n = strlen(temp);
    		    if(n>0)
    Dans quels cas n peut-il être égal à 0 ? (je parle de cas concrets, pas de choses du genre "pour POSIX, la taille du membre d_name n'est pas spécifiée"...)

    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        	    	    	if (temp[n-1]!='/')
        	    	    	    {
    			    strcat(strcat(temp, "/"), d->d_name);
    			    }
    		    	else
    			    {
    			    strcat(temp, d->d_name);
    			    }
    Pourquoi pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        	    	    	if (temp[n-1]!='/')
        	    	    	    {
    			    strcat(temp, "/");
    			    }
    		    	strcat(temp, d->d_name);
    ?


    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	    	    	tmprep = opendir(temp);
    		    	if(tmprep != NULL) 
    		    	    {
    			    closedir(tmprep);
    			    if(CreerDB(temp,db)==EXIT_FAILURE) 
    			    	{
    			    	closedir(repertoire);
    			    	return EXIT_FAILURE;
    			    	}
    			    }
    Pourquoi faire un opendir() ici alors que si on appelle CreerDB() il y en aura un de fait de toutes façons ? Autrement dit : pourquoi écrire une fonction récursive si c'est pour "déplier" (<- peut-ête pas le bon mot) une partie du code dans cette dernière ?

    C'est tout pour l'instant

Discussions similaires

  1. [PHP 5.4] Erreur sortie de nulle part
    Par thebarbarius dans le forum Langage
    Réponses: 7
    Dernier message: 12/03/2010, 05h06
  2. un margin et/ou un padding venu de null part
    Par LaDeveloppeuse dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 19/02/2008, 11h34
  3. Erreur de conversion de type Null en String
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/07/2005, 15h25
  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