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 :

problème dans l'exécution


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut problème dans l'exécution
    salut
    je veux faire une saisie d'une chaine de caracère qui contient des motsséparées par des ';'. chaque mot est séparé par un '- '(je peux distinguer dans chaque mot une partie gauche et une autre droite grace à '-'.puis je veux inserer cette chaine dans une liste chaineé :chaque fois que je trouve un ';' j'insere ce mot(la partie gauche dans le champ A de la structure RGL et la partie gauche dans le champ termin,et si dans un mot je trouve '|' j'insere ce qui est avant '|' dans un noeud et ce qui est apès '|' dans un autre noeud mais avec le meme champ A (EXEMPLE : si j'ai comme chaine E-BC;Z-as |R ;
    je veux mettre E,B et C dans le meme noeud (E dans le champ A et BC dans le champ termin puis j'insere un nouveau noeud dont le champ A contient Z et le champ termin contient as puis j'insère un nouveau noeud dont le champ A contient Z et le champ termin contient R)
    j'ai developpé un code en c il compile mais il ne s'éxécute pas pouvez vous m'aider svp?
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include<conio.h>
    struct regle
          {
           char A;
           char termin[16];
           struct regle* next;
     
          };
    typedef struct regle RGL;
     
    struct grammaire
          {
           char nntrmn[16];
           char trmn[16];
           RGL *r;
           char S ;
          };
    typedef struct grammaire GRM ;
     
     
     //ajout d'une production
     RGL *ajout ( RGL *p, char A,char B[])
    {
       /* allocation du noeud */
       RGL *p_new = malloc (sizeof *p_new);
     
       /* si tout s'est bien passe : */
       if (p_new != NULL)
       {
          /* mise a jour des champs : */
     
          /* donnees */
          p_new->A=A;
          strcpy(p_new->termin,B);
          /* chainage par defaut */
          p_new->next = NULL;
     
          /* chainage */
          if (p == NULL)
          {
             /* c'est le premier : */
             p = p_new;
          }
          else
          {
             /* on cherche le dernier noeud */
             RGL *q = p;
     
             while (q->next != NULL)
             {
                /* pointer sur le suivant */
                q = q->next;
             }
     
             /* modification du chainage */
             q->next = p_new;
          }
       }
       return p;
    }
     
    //affichage de la liste des productions
    void affichage (RGL *p)
    {
       RGL *q = p;
     
       while (q != NULL)
       {
          /* afficher les données courantes */
          printf ("%s ", q->A);
          printf ("%s ", q->termin);
     
     
          /* pointer sur le suivant */
          q = q->next;
       }
       /* afficher la fin */
       printf ("NIL\n");
    }
     
    int main(int argc,char argv[])
     
    {
        //saisie d'une grammaire
     
        GRM *m;
        char NT[16];
        char T [16];
        char P[18];
        char A[1];
        int i,pos,s,e,i1,j;
        RGL *p=NULL;
        printf("Donner les symboles non terminaux de votre grammaire \n" );
        scanf("%s",NT);
     
        printf("Donner les symboles terminaux de votre grammaire \n ");
        scanf("%s",T);
     
        printf("Donner votre axiome \n ");
        scanf("%s",A);
        printf("Veuillez entrer vos regles de productions ( Marquez un ; a la fin de chaque regle et separez votre partie droite de celle gauche par -) \n ");
        scanf("%s",P);
        for(i=1;i<strlen(P);i++)
        {
          if(P[i]='-')
          {   char k[]="";
              for(j=i;P[j+1]=';';j++)
              {
                  sprintf(k, "%c", P[j]);
              }
              ajout(p,P[i-1],k);
          }
          else if(P[i]='|')
          {
              char l[]="";
              pos=0;
              char c[]="";
              for(s=i;P[s]='-';s--)
              ;
              pos=s-1;// pour chercher la position du non terminal
              for(e=pos+2;P[e+1]='|';e++)
              {
                  sprintf(l,"%c",P[e]);
              }
              ajout(p,P[pos],l);//je récupère la partie droite de la production avant le | et je la mets ds une production
              for(i1=i+1;P[i1]==';';i1++)
              {
                sprintf(c,"%c",P[i1]);
              }
              ajout(p,P[pos],c);//je récupère la partie gauche de la production après le | et je la mets ds une production
          }
        }
        //affichage de la liste des productions
        affichage(p);
     
     
     
     
     
        system("pause");
    }

  2. #2
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bon, j'ai pas tout épluché en détail, mais ce que j'en ai retenu.

    - A la ligne 110, est-ce normal que P[j+1] soit affecté à ';' à l'aide de l'opérateur '='. Ne voulais-tu pas plutôt utiliser l'opérateur de comparaison '=='.
    - J'ai vu plusieurs fois des chaînes de caractère déclarées comme ceci :
    Le problème c'est que, comme tu ne donnes pas explicitement la taille de la chaîne entre crochets, c va avoir une taille égale au nombre de caractères spécifiés lors de l'initialisation. Ici, c contient simplement le caractère '\0', donc c sera une chaîne de caractère de taille 1. Du coup, dans tes sprintf qui suivent, tu risques un débordement de tableau à plusieurs reprises. D'où les erreurs de segmentation rencontrées, qui « empêchent » l'exécution de ton programme.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    merci pour ton aide

  4. #4
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    ça s'éxécute maintenant mais il m'affiche NIL il ne m'affiche pas ma liste chaineé

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut bonne année
    108 if(P[i]=='-')
    pas une affectation
    109 { char k[16]; char * kk; kk = k;
    pour pouvoir ajouter des lettres a la chaine k
    avec sprintf il faut tenir à jour un pointeur
    sur la caractère suivant : kk
    110 for(j = i + 1; P[j] != ';'; j++)
    j = i indexe '-', on ne le garde pas d'ou i + 1
    avec P[j + 1] == ';' on n'entre jamais dans la boucle
    avec P[j + 1] != ';' oui, mais on oublie le char avant ';'
    avec P[j} != ";' c'est mieux
    111 kk += sprintf(kk, "%c", P[j]);
    pour ne pas toujours ecrire au debut de la chaine k
    112 sprintf(kk, "%c", 0);
    pour terminer la chaine par un 0
    111 p = ajout(p, P[i - 1], k);
    pour que p ne reste pas NULL

    idem dans la suite du programme...

    rem lol sprintf au lieu de k[n++] = P[j]

    rem tel quel ton programme stocke les 3
    {a, bc|ef} {a, bc} {a, ef}
    quand il analyse
    a-bc|ef;

    bonne chance

  6. #6
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Par défaut
    j'ai changé ce que tu m'as dit mais dés que je fais la saisie de ma chaine et je tappe sur entreé il me dit le programme cesse de fonctionner

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/01/2010, 16h30
  2. Réponses: 4
    Dernier message: 14/11/2009, 14h52
  3. Problème dans l'exécution d'une requete !
    Par zouzou_18 dans le forum VB.NET
    Réponses: 4
    Dernier message: 07/08/2009, 16h30
  4. Problème dans l'exécution du start.bat sous jbpm
    Par Simply Smart dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 19/02/2008, 14h31

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