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 :

Probleme d'éxécution de mon programme


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 12
    Points
    12
    Par défaut Probleme d'éxécution de mon programme
    Bonjour à tous,

    Mon problème est le suivant:

    En fait j'ai fait une fonction qui extraie un fichier texte qui contient le dictionnaire (en gros 300000 mots) et ces 300000 mots je dois les ranger dans un arbre (une lettre par noeud de mon arbre).
    A priori cela marche sauf que quand je veux executer l'executable (;o)) et bien la fenetre dos s'ouvre et se referme quasi instantanément BUT WHY ???
    Après différent test (system("pause")) à chaque itération de ma boucle la fenetre DOS s'ouvre bien puis aux alentours du 1000eme ou 2eme mot la fenetre DOS se ferme sans prevenir.

    A mon humble avis ça à l'air d'être un problème mémoire mais d'un autre coté il n'y a aucun message d'erreur ni à la compilation ni à l'execution donc QUID ???

    Merci d'éclairer ma lanterne et si possible de m'expliquer comment résoudre le problème.

    Bonne nuit....

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    Tu as pensé à mettre un systeme("Pause"); avant le return de ton main ?
    Car sinon une fois la tache effectué, windows ferme la fenêtre de dos.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 12
    Points
    12
    Par défaut
    Oui oui bien sur...

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 12
    Points
    12
    Par défaut
    Voici la partie pertinente du code, peut-être y verrez-vous la solution....
    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
     
    noeud * creernoeud(char carac)
    {
          noeud *n;
          n=(noeud*)malloc(sizeof(noeud));
          n->caract=carac;
          n->fbase=0;
          n->a=NULL;
          n->b=NULL;
          n->c=NULL;
          n->d=NULL;
          n->e=NULL;
          n->f=NULL;
          n->g=NULL;
          n->h=NULL;
          n->i=NULL;
          n->j=NULL;
          n->k=NULL;
          n->l=NULL;
          n->m=NULL;
          n->n=NULL;
          n->o=NULL;
          n->p=NULL;
          n->q=NULL;
          n->r=NULL;
          n->s=NULL;
          n->t=NULL;
          n->u=NULL;
          n->v=NULL;
          n->w=NULL;
          n->x=NULL;
          n->y=NULL;
          n->z=NULL;
     
          return n;
    }
     
    void extraireDonnees(noeud *arbre, char nomFichier[]){               //fonction qui permet d'extraire les données contenu dans le fichier stations.data pour les rentrer dans le graphe
        long n=1, i=0, k;
        char ** tabChar;
        char tmp;
        noeud * courant=arbre;
        int tailleTab=25;
        FILE * f=fopen(nomFichier,"r");
        char ligne[26];
        if(f==NULL){
            printf("Fichier introuvable \n");
            return ;
        }
        while(fgets(ligne,256,f) != NULL)
        {
            tabChar=str_split(ligne," ",&tailleTab);
     
           while(tabChar[0][i]!=0)
           {
     
                                  switch(tabChar[0][i])
                                  {
                                                       case 'a' : if(courant->a==NULL)
                                                                  {
                                                                  courant->a=creernoeud(tabChar[0][i]);
     
                                                                  }
                                                                  courant=courant->a;
                                                                  break;
                                                     case 'b' : if(courant->b==NULL)
                                                                  {
                                                                  courant->b=creernoeud(tabChar[0][i]);
     
                                                                  }
                                                                  courant=courant->b;
                                                                  break;
                                                     case 'c' : if(courant->c==NULL)
                                                                  {
                                                                  courant->c=creernoeud(tabChar[0][i]);
     
                                                                  }
                                                                  courant=courant->c;
                                                                  break;
     
                                                    // (etc...)
     
                                                     case 'y' : if(courant->y==NULL)
                                                                  {
                                                                  courant->y=creernoeud(tabChar[0][i]);
     
                                                                  }
                                                                  courant=courant->y;
                                                                  break;
                                                     case 'z' : if(courant->z==NULL)
                                                                  {
                                                                  courant->z=creernoeud(tabChar[0][i]);
     
                                                                  }
                                                                  courant=courant->z;
                                                                  break;
     
                                      }
                                      if(tabChar[0][i+1]==0) courant->fbase=1;
                                      i++;
           }
          printf("%d\n",n);
          n++;
          system("PAUSE");
        }
        fclose(f);
        return ;
    }
     
    int main()
    {
        noeud arbre;
        extraireDonnees(&arbre, "dico2.txt");
        printf("ok\n");
        system("PAUSE");	
        return 0;
    }

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Je vois tout de suite 2 choses qui ne collent pas :

    Citation Envoyé par BigWill
    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
    void extraireDonnees(noeud *arbre, char nomFichier[]){               //fonction qui permet d'extraire les données contenu dans le fichier stations.data pour les rentrer dans le graphe
        long n=1, i=0, k;
        char ** tabChar;
        char tmp;
        noeud * courant=arbre;
        int tailleTab=25;
        FILE * f=fopen(nomFichier,"r");
        char ligne[26]; 
       if(f==NULL){
            printf("Fichier introuvable \n");
            return ;
        }
        while(fgets(ligne,256,f) != NULL)
        {
            tabChar=str_split(ligne," ",&tailleTab);
    
           while(tabChar[0][i]!=0)
           {
    d'abord JAMAIS de code exécutable entre des déclarations (sauf si la déclaration suivante est entourée d'accolades, mais c'est un cas particulier).

    Ensuite c'est tabCar[0][i] != '\0' ...

    Aussi dans ton allocation de noeud, si tu faisais calloc au lieu de malloc tu n'aurais pas besoin de tout mettre à NULL.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    0 et '\0' c'est pareil.

  7. #7
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Je vois au moins une erreur. Le tableau ligne est de taille 26 et pourtant le fgets indique que vous autorisez jusqu'à 255 caractères.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par BigWill
    Voici la partie pertinente du code, peut-être y verrez-vous la solution....
    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
     
    noeud * creernoeud(char carac)
    {
          noeud *n;
          n=(noeud*)malloc(sizeof(noeud));
          n->caract=carac;
          n->fbase=0;
          n->a=NULL;
          n->b=NULL;
          n->c=NULL;
          n->d=NULL;
          n->e=NULL;
          n->f=NULL;
          n->g=NULL;
          n->h=NULL;
          n->i=NULL;
          n->j=NULL;
          n->k=NULL;
          n->l=NULL;
          n->m=NULL;
          n->n=NULL;
          n->o=NULL;
          n->p=NULL;
          n->q=NULL;
          n->r=NULL;
          n->s=NULL;
          n->t=NULL;
          n->u=NULL;
          n->v=NULL;
          n->w=NULL;
          n->x=NULL;
          n->y=NULL;
          n->z=NULL;
     
          return n;
    }
    Overkill ! Il faut apprendre des méthodes plus simples et surtout plus sûres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    noeud * creernoeud (int carac)
    {
       noeud *n = malloc (sizeof *n);
       if (n != NULL)
       {
          static const noeud z = {0};
          /* tous les champs à 0 */
          *n = z; 
     
          n->caract = carac;
       }      
       return n;
    }
    Avec ceci
    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
    #ifdef ED
    #include "ed/inc/tok.h"
    #include <string.h>
    #endif
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
     
    typedef struct noeud
    {
       int caract;
       int fbase;
       struct noeud *a;
       struct noeud *b;
       struct noeud *c;
       struct noeud *d;
       struct noeud *e;
       struct noeud *f;
       struct noeud *g;
       struct noeud *h;
       struct noeud *i;
       struct noeud *j;
       struct noeud *k;
       struct noeud *l;
       struct noeud *m;
       struct noeud *n;
       struct noeud *o;
       struct noeud *p;
       struct noeud *q;
       struct noeud *r;
       struct noeud *s;
       struct noeud *t;
       struct noeud *u;
       struct noeud *v;
       struct noeud *w;
       struct noeud *x;
       struct noeud *y;
       struct noeud *z;
     
    }
    noeud;
     
    noeud *creernoeud (int carac)
    {
       noeud *n = malloc (sizeof *n);
       if (n != NULL)
       {
          static const noeud z = { 0 };
          /* tous les champs à 0 */
          *n = z;
     
          n->caract = carac;
       }
       return n;
    }
     
    #ifdef ED
    char **str_split (char const *s, char const *sep, int *p_taille)
    {
       char **tab = NULL;
     
       if (s != NULL && sep != NULL && p_taille != NULL)
       {
          sTOK *ptok = TOK_create (s, sep, NULL);
          if (ptok != NULL)
          {
             sTOK_INFO info;
             TOK_get (ptok, &info);
             /* faire une copie dynamique du tableau de pointeurs */
             {
                size_t size = info.argc * sizeof *tab;
                tab = malloc (size);
                if (tab != NULL)
                {
                   memcpy (tab, info.argv, size);
                   *p_taille = info.argc;
                }
             }
             TOK_delete (ptok), ptok = NULL;
          }
       }
       return tab;
    }
    #else
    char **str_split (char const *s, char const *sep, int *p_taille)
    {
       char **tab = NULL;
     
       if (s != NULL && sep != NULL && p_taille != NULL)
       {
          /* ton code ... */
     
       }
       return tab;
    }
    #endif
     
    /* fonction qui permet d'extraire les données contenu dans
    le fichier stations.data pour les rentrer dans le graphe */
    void extraireDonnees (noeud * arbre, char const nomFichier[])
    {
       FILE *f = fopen (nomFichier, "r");
     
       if (f != NULL)
       {
          noeud *courant = arbre;
          char ligne[80];
          long n = 1;
     
          while (fgets (ligne, sizeof ligne, f) != NULL)
          {
             int tailleTab = 0;
             char **tabChar = str_split (ligne, " ", &tailleTab);
     
             if (tabChar != NULL)
             {
                size_t i = 0;
     
                while (tabChar[0][i] != 0)
                {
                   switch (tabChar[0][i])
                   {
     
    /* -ed- laisser la machine ecrire le code... */
    #define CASE(lettre,  id)\
                   case lettre:\
                      if (courant->id == NULL)\
                      {\
                         courant->id = creernoeud (tabChar[0][i]);\
                      }\
                      courant = courant->id;\
                      break
     
                      CASE ('a', a);
                      CASE ('b', b);
                      CASE ('c', c);
                      CASE ('d', d);
                      CASE ('e', e);
                      CASE ('f', f);
                      CASE ('g', g);
                      CASE ('h', h);
                      CASE ('i', i);
                      CASE ('j', j);
                      CASE ('k', k);
                      CASE ('l', l);
                      CASE ('m', m);
                      CASE ('n', n);
                      CASE ('o', o);
                      CASE ('p', p);
                      CASE ('q', q);
                      CASE ('r', r);
                      CASE ('s', s);
                      CASE ('t', t);
                      CASE ('u', u);
                      CASE ('v', v);
                      CASE ('w', w);
                      CASE ('x', x);
                      CASE ('y', y);
                      CASE ('z', z);
    #undef CASE
                   }
                   if (tabChar[0][i + 1] == 0)
                      courant->fbase = 1;
                   i++;
     
                }
                printf ("%ld\n", n);
                n++;
                free (tabChar), tabChar = NULL;
             }
             else
             {
                printf ("split error\n");
                break;
             }
             assert (tabChar == NULL);
          }
          fclose (f);
       }
       else
       {
          perror (nomFichier);
       }
       return;
    }
     
    int main (void)
    {
       noeud arbre;
       extraireDonnees (&arbre, "dico_fr_min.txt");
       printf ("ok\n");
       return 0;
    }
    et un dictionnaire de 336531 mots en minuscule et avec des accents (Windows-1252),

    http://delahaye.emmanuel.free.fr/dico/dico_fr_min.txt

    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <...>
    336528
    336529
    336530
    336531
    ok
     
    Press ENTER to continue.
    Il existe une version en majuscule sans accents :
    http://delahaye.emmanuel.free.fr/dico/dico_fr_maj.txt
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 12
    Points
    12
    Par défaut
    Merci pour vos coups de main ça ma permis de corriger quelques petites erreurs.
    Néanmoins l'erreur principale était en fait que dans ma fonction "extraireDonnees" j'oublié d'initialiser mon pointeur courant à "courant=arbre" au début de la boucle while ce qui fait que s'ajouter à la suite et non pas à partir du début.

    Merci encore

Discussions similaires

  1. Probleme avec mon programme des 8 reines
    Par zuzu6969 dans le forum C++
    Réponses: 12
    Dernier message: 08/04/2010, 14h30
  2. Réponses: 4
    Dernier message: 15/01/2008, 11h52
  3. probleme lors de l'execution de mon programme
    Par s-ehtp dans le forum Débuter
    Réponses: 24
    Dernier message: 04/11/2007, 23h15
  4. probleme dans mon programme
    Par phpaide dans le forum Langage
    Réponses: 8
    Dernier message: 05/06/2006, 12h57
  5. [TP] Problème avec mon programme de conversion
    Par Panzer95 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 28/05/2006, 18h36

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