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 :

Fonction récursive et pointeurs = plantage et n'importe quoi


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Mars 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Mars 2017
    Messages : 59
    Points : 39
    Points
    39
    Par défaut Fonction récursive et pointeurs = plantage et n'importe quoi
    Bonjour,
    Je crée un programme pour renommer (de 0 à 3000) une série de photos contenues dans différents sous-dossiers de mon dossier "images".

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    #include <windows.h>
     
    int traiter_rep(DIR* repertoire[], struct dirent* fichierLu, int* p_i, int n, char buffer[])
    {
     
        n++; /* incrémente le "niveau" de sous repertoire par rapport au rep parent */
        while((fichierLu = readdir(repertoire[n])) != NULL)
        {
            printf("\n%s   ", fichierLu->d_name); /*Affiche nom du fichier*/
     
            if ((!strstr(fichierLu->d_name,"."))&& opendir(fichierLu->d_name)!= NULL) /* Si fichier est un dossier (ne contient pas de ".") */
            {
                traiter_rep(repertoire, fichierLu, p_i, n, buffer);
                continue;
     
            }
     
            if (strstr(fichierLu->d_name,".jpg")||(strstr(fichierLu->d_name,".jpeg"))) /*Si fichier lu = image jpg ou jpeg*/
            {
                /*Copie du nom de fichier en metadonnées "TITRE" :
     
                NOTE: J'ai pas encore trouvé comment faire
                */
     
     
     
                /*Genreation d'un nouveau nom de fichier: */
                *p_i++;
                snprintf (buffer, sizeof buffer, "%06d.jpg",*p_i);
                printf ("\n          JPEG DETECTED -> NEW NAME: %s",buffer);
                rename(fichierLu->d_name, buffer);
     
     
            }
            printf("\n\n\n%i photos trait\202es\n",*p_i);
        }
    }
     
    int main()
    {
    int i=0, j=0, n=0;
    int *p_i=&i;
    char buffer[128];
     
    DIR* repertoire[10];
    for (j=0; j<10; j++)
        repertoire[j] = NULL;
     
     
    struct dirent* fichier_en_cours = NULL;
     
    repertoire[1] = opendir(".");
    if (repertoire[1] == NULL)
        exit(1);
     
     
     
    traiter_rep(repertoire, fichier_en_cours, p_i, n, buffer);
     
     
     
    printf("%i photos trait\202es\n\n",i);
    printf("Programme execut\202 avec succ\212s \n\n");
    system("PAUSE");
    return 0;
    }
    Aucune erreur de compilation ,mais à l'execution, les noms de fichiers sont pas du tout incrémentés, ils semblent aléatoires, et l'extension .jpg à disparue.. De plus, toutes les photos ne sont pas traitées..

    Voyez-vous mon (mes) erreur(s) ?

    Merci d'avance

    Raphaël

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça c'est très mauvais, tu as une fuite de descripteur ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ((!strstr(fichierLu->d_name,"."))&& opendir(fichierLu->d_name)!= NULL)
    De plus, si c'est pour tester si c'est un répertoire, pourquoi utiliser opendir() plutôt que S_ISDIR()? Et pourquoi prendre fichierLu en paramètre?
    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
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Mars 2017
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Mars 2017
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Merci, mais je ne comprends pas ce que tu entends par "une fuite de descripteur" ..

    Je n'ai pas utiliser S_ISDIR() car la syntaxe me semble assez complexe, et m'oblige à passer par une structure stat.. Mais là n'est pas le problème. Même en supprimant ce test, les valeurs sont toujours incorrectes. Il doit y avoir un problème au niveau de mon pointeur p_i, mais lequel ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par r4ph0u Voir le message
    Je n'ai pas utiliser S_ISDIR() car la syntaxe me semble assez complexe, et m'oblige à passer par une structure stat..
    Ah désolé, je croyais que le champ détaillant le type de fichier était inclus dans la structure dirent...
    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.

Discussions similaires

  1. plantage dans une fonction récursive
    Par Lintel-oo dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2014, 21h16
  2. Pointeur dans fonction récursive
    Par Invité dans le forum Débuter
    Réponses: 3
    Dernier message: 15/07/2008, 16h33
  3. Pointeur int dans fonction récursive
    Par Invité dans le forum Débuter
    Réponses: 5
    Dernier message: 29/05/2008, 16h38
  4. Fonction retournant un pointeur
    Par Le Furet dans le forum C
    Réponses: 8
    Dernier message: 25/09/2005, 18h54
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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