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 (encore. . .)


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut Erreur de segmentation (encore. . .)
    Bonjour à tous,

    J'ai lu le post en dessous, mais je ne trouve pas mon bonheur dedans... J'ai fait tous les sites reprennant les infos sur les chaine de caractères et j'en peux plus, parce que j'ai l'impression de respecter tout ce qu'il faut... Mais ca me le fait toujours... Donc j'en viens à vous appeler au secours!

    J'ai tenté d'appliquer les remarques que l'on m'avait conseillées dans les posts précédents. Mais rien n'y fait alors que je suis reparti à zéro.

    En gros, mon but est de créer un nom de fichier dans le répertoire de l'application. Ce nom de fichier doit être aléatoire.


    Je vous transmets mon code:


    Récupération du nom de fichier : (OK)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char * filename;
     
    char * getFilename() 
    {
         return filename;     
    }
     
    void setFilename(char * s_Filename)
    {
         filename = s_Filename;    
    }

    Récupération du répertoire courant : (OK)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        char s_Directory[100];
        GetCurrentDirectory(sizeof(s_Directory),s_Directory);

    Création nom de fichier : OK : Lorsque je définis moi-même les champs, ca fonctionne. Il me crée bien mon fichier dans c:/test/fichier21229.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        srand(time(NULL));
     
        const char *  s_Vol= "c:";    
        const char *  s_Dir = "test";   
        const char *  s_Filename= "fichier";   
        const char *  s_Ext= ".txt";
     
        char * s_Path = malloc (sizeof (*s_Path) * 1024);
        sprintf(s_Path, "%s\\%s\\%s%d%s", s_Vol, s_Dir,s_Filename,rand(),s_Ext);
     
        setFilename(s_Path);

    Création nom de fichier : (NOK) : Par contre, lorsque j'utilise mon s_Directory, il m'envoie péter... Alors que lorsque j'affiche mon s_Path, il est bien : c:/test/fichier21229.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        srand(time(NULL));
     
        const char *  s_Filename= "fichier";   
        const char *  s_Ext= ".txt";
     
        char * s_Path = malloc (sizeof (*s_Path) * 1024);
        sprintf(s_Path, "%s\\%s%d%s",s_Directory,s_Filename,rand(),s_Ext);
     
        setFilename(s_Path);
     
        printf("%s",getFilename()); // Affiche c:/test/fichier21229.txt
    J'espère que vous y verrez plus clair que moi.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Déjà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char * getFilename() 
    {
        /* attention, ici on renvoie un un pointeur modifiable, 
            est ce bien le comportement voulu ? */
        return filename;     
    }
     
    void setFilename(char * s_Filename)
    {
        /* NON, une copie de chaine se fait avec str[n]cpy */    
        filename = s_Filename;    
    }
    il m'envoie péter
    Qui ça ?? (quel est le message d'erreur ?)
    Chez moi, le code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >gcc -Wall -Wextra  08-10-22.c
     
    >./a.exe
    c:\test\fichier1784060792.txt

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut
    Qu'entends-tu par :
    /* attention, ici on renvoie un un pointeur modifiable,
    est ce bien le comportement voulu ? */
    De plus, lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void setFilename(char * s_Filename)
    {
         strcpy(filename,s_Filename);    
    }
    J'ai une erreur de mémoire alors que ca fonctionne avec le filename = s_Filename.


    Sinon, les erreurs qu'il m'envoie sont des erreurs de mémoire ne pouvant être read... (Sur windows)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut
    Mais le but est que le fichier texte se crée dans le même répertoire que l'executable...

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par WaKaaN Voir le message
    J'ai une erreur de mémoire alors que ca fonctionne avec le filename = s_Filename.
    Oui car pour appeler la fonction strcpy(dst, src), il faut qu'il y ai suffisament de place allouée dans dst.

    Quand je dis
    attention, ici on renvoie un un pointeur modifiable,
    est ce bien le comportement voulu ?
    Ça veut dire que la fonction getFilename n'est pas sure.

    Si je tape je change le disque sans avoir demandé à modifer la variable filename.

    Sinon, les erreurs qu'il m'envoie sont des erreurs de mémoire ne pouvant être read... (Sur windows)
    As tu fait une execution pas à pas pour voir exactement d'où cela venait ?

    Mais le but est que le fichier texte se crée dans le même répertoire que l'executable...
    Pas besoin de s'embêter avec GetCurrentDirectory. Si on tape fopen("toto", "w"); le fichier toto sera créé dans le répertoire courant.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut
    Comment rendre ma fonction getFilename sure alors?

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par WaKaaN Voir le message
    Comment rendre ma fonction getFilename sure alors?
    Minimum syndical :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char *getFilename()
    {
        return filename;
    }
    Solution un peu plus évoluée :
    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
    /**
     * accession à filename
     * @param[out] buffer: buffer où écrire le nom du fichier
     * @param[in] buf_size: taille du buffer, /!\ '\0' final INCLUS
     * @return 0 si OK
     */
    int getFilename(char * buffer, size_t buf_size)
    {
        int err = 0;
        size_t size = strlen(filename);
        if(buf_size < (size+1)) {
            /* le buffer de destination n'est pas assez grand */
            err = 1;
        } else {    
            /* buf_size - 1 pour être sur que buffer se termine par '\0', 
                cf man strncpy*/
            strncpy(buffer, filename, buf_size - 1);
        }
     
        return err;
    }

Discussions similaires

  1. Erreur de segmentation, encore une
    Par LCoileux dans le forum C
    Réponses: 6
    Dernier message: 10/04/2011, 23h33
  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