Probleme en C

Fermé
info20111 Messages postés 3 Date d'inscription samedi 24 décembre 2011 Statut Membre Dernière intervention 11 janvier 2012 - 11 janv. 2012 à 00:42
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 12 janv. 2012 à 16:36
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
#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

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 12/01/2012 à 16:38
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
0