Probleme en C
info20111
Messages postés
3
Statut
Membre
-
Hxyp Messages postés 401 Date d'inscription Statut Membre Dernière intervention -
Hxyp Messages postés 401 Date d'inscription Statut Membre Dernière intervention -
salut
mon programme m'affiche "le programme a cessé de fonctionner".
En fait mon c'est un projet de tlc(tla) que j'ai dévéloppé avec C qui connsiste à prendre une grammaire non contextuelle et d'appliquer l'algorithme d'élimination ndes symboles inutiles et inaccssibles (lorsque j'exécute seulement la saisie il marche mais dés que j'ajoute le reste de l'algorthme il m'affiche "le programme a cessé de fonctionner"
voici mon code
mon programme m'affiche "le programme a cessé de fonctionner".
En fait mon c'est un projet de tlc(tla) que j'ai dévéloppé avec C qui connsiste à prendre une grammaire non contextuelle et d'appliquer l'algorithme d'élimination ndes symboles inutiles et inaccssibles (lorsque j'exécute seulement la saisie il marche mais dés que j'ajoute le reste de l'algorthme il m'affiche "le programme a cessé de fonctionner"
voici mon code
#include <stdio.h>
#include <stdlib.h>
#include <string.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");
}
//suppression d'une production
RGL *supprim_noeud (RGL *r, char x)
{
RGL *m = NULL;
if (r && r->A== x)
{
m = r->next;
r->next = m->next;
free ( m);
m= NULL;
}
return m;
}
int existe(char b[],char t[])
{
int k=0;
int i;
for(i=0;i<strlen(b);i++)
{ if( strchr(t,b[i]) != NULL )
k++;
}
if (k=strlen(b)) return 1;
else return 0;
}
int existance (char b[],char t[], char prod[])
{
int k=0;
int i;
for( i=0;i<strlen(b);i++)
{ if( (strchr(t,b[i])!= NULL ) || (strchr(prod,b[i])!= NULL ))
k++;
}
if (k=strlen(b)) return 1;
else return 0;
}
// Algorithme1
void calcul_prod( GRM *m ,char prod[16])
{
char new[16];
int i,j=0;
RGL *mr;
mr=m->r;
for( ;mr; mr=mr->next)
{
while(existe(mr->termin ,m->trmn))
{
prod[i]= mr->A;
i=i+1;
}
}
for(;mr;mr=mr->next)
{
if (existance(mr->termin, prod,m->trmn))
{
new[j]=mr->A;
j++;
prod= strcat(prod,new);
}
}
for(;mr;mr=mr->next)
{
if ( strchr(prod,mr->A)== NULL )
{
supprim_noeud(mr,mr->A); // supprime le noeud
}
}
// affichage de la nouvelle liste chainée
}
int main(int argc,char argv[])
{
//saisie d'une grammaire
GRM *m;
char NT[16];
char T [16];
char P[18];
char A;
int i,pos,s,e,i1,j;
RGL *p=NULL;
printf("Donner les symboles non terminaux de votre grammaire \n %s",NT);
strcpy(m->nntrmn,NT);
printf("Donner les symboles non terminaux de votre grammaire \n %s",T);
strcpy(m->trmn,T);
printf("Donner votre axiome \n %s",A);
m->S=A;
printf( "Veuillez entrer vos règles de productions ( Marquez un ; à la fin de chaque règle et séparez votre partie droite de celle gauche par -) \n %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");
}
1 réponse
Bonjour, dans le main GRM *m; m est un pointeur et vous l'utilisez mais il pointe n'importe où vu qu'il n'y a pas eu d'allocation
soit vous n'utilisez pas de pointeur :
GRM m; et modifiez l'accès aux membres dans les strcpy , strcpy(m->nntrmn,NT); devient strcpy(m.nntrmn,NT);
soit vous utilisez malloc :
GRM *m;
m=malloc(sizeof(GRM));
aussi faites attention dans pas mal de conditions vous avez oublié un "=",
1 = affectation
2 == condition
soit vous n'utilisez pas de pointeur :
GRM m; et modifiez l'accès aux membres dans les strcpy , strcpy(m->nntrmn,NT); devient strcpy(m.nntrmn,NT);
soit vous utilisez malloc :
GRM *m;
m=malloc(sizeof(GRM));
aussi faites attention dans pas mal de conditions vous avez oublié un "=",
1 = affectation
2 == condition