分段故障(核心转储)Yacc / C.

时间:2014-05-24 23:11:39

标签: c yacc

我遇到了一个我从未遇到过的问题。我知道崩溃程序的哪一段代码,我只是不知道如何解决它。我有两个链接列表正在搜索特定的"密钥"在两个功能。现在,尽管函数与Ifs一起正常工作,但它不会按预期工作,因为它不是循环,它们只会通过链表一次,而且它们发出的信息不正确。我尝试使用一段似乎是正确的,但最终由于某种原因它崩溃了程序。这就是我希望得到帮助的地方:)

yacc文件:

%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int yylineno;
int r; int c; int n;
typedef struct{char c[50]; int *p;} em;
%}
%union {struct {char c[50];} buf; struct esta{char info[50]; int nu; struct esta *next;} *p; struct trans{char esti[50]; char estf[50]; char nome[50]; int nu; struct trans *next;} *q;}
%start gda
%token<buf> BEGINTAG ENDTAG DEFINETAG AUT EST CODC
%type<p> desta naute aute nest dest 
%type<q> dtraa nautt autt ntra dtra
%type<buf> devea deve eve com
%%
gda  : gda desta dtraa devea {struct trans *t;struct esta *ei;struct esta *ef;t=getTransInfo($3,$4.c);ei=getEstInfo($2,t->esti);ef=getEstInfo($2,t->estf);printf("%s %s %s %d %s %d\n",t->esti,t->estf,ei->info,ei->nu,ef->info,ef->nu);}
     |
     ;
desta: DEFINETAG BEGINTAG naute ENDTAG {$$=$3;}
     ;
naute: naute aute {$$=$2;}
     | aute {$$=$1;}
     ;
aute : AUT nest {$$=$2;}
     ;
nest : nest dest {$$=$2;$2->next=$1;r++;$2->nu+=r;}
     | dest {$$=$1;$1->next=0;r=0;}
     ;
dest : EST {$$=newEst($1.c);}
     ;
dtraa: DEFINETAG BEGINTAG nautt ENDTAG {$$=$3;}
     ;
nautt: nautt autt {$$=$2;}
     | autt {$$=$1;}
     ;
autt : AUT ntra {$$=$2;}
     ;
ntra : ntra dtra {$$=$2;$2->next=$1;c++;$2->nu+=c;}
     | dtra {$$=$1;$1->next=0;c=0;}
     ;
dtra : EST '-''>' EST '(' EST ')' {$$=newTrans($1.c,$4.c,$6.c);}
     ;
devea: devea AUT BEGINTAG deve ENDTAG {$$=$4;}
     | AUT BEGINTAG deve ENDTAG {$$=$3;}
     ;
deve : deve eve CODC {$$=$2;}
     | eve CODC {$$=$1;}
     ;
eve  : '(' com ')'':' com {$$=$2;}
     ;
com  : EST {strcpy($$.c,$1.c);}
     ;
%%
int main(){
yyparse();
return 0;
}
int yyerror(char *s){fprintf(stderr, "ERRO(%d):%s\n", yylineno,s); return 0;}
struct esta *newEst(char c[50]){struct esta *p=(struct esta*) malloc(sizeof(struct esta)); strcpy(p->info,c); p->nu=1; p->next=0 ; return p;}
struct trans *newTrans(char ei[50],char ef[50],char n[50]){struct trans *q=(struct trans*)malloc(sizeof(struct trans));strcpy(q->esti,ei);strcpy(q->estf,ef);strcpy(q->nome,n);q->nu=1;q->next=0;return q;}
struct esta *getEstInfo(struct esta *s,char c[50]){if(s->info!=c){s=s->next;}else{return s;}}
struct trans *getTransInfo(struct trans *s,char c[50]){while(s->nome!=c){s=s->next;}return s;}

我所谈论的功能是最后两个。 getEstInfo和getTransInfo。我认为它们都需要改变,但我不知道如何。关于如何使我的代码更高效的任何其他评论都很高兴被接受。谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。在失败并再次失败之后,我重新实现了最后两个函数,并且我使用了whiles:

struct esta *getEstInfo (struct esta *s, char c[50])
{
    int i;

    while (s)
    {
        i = strcmp(s->info, c);
        if (i != 0)
        {
            s=s->next;
        } else
        {
            return s;
            break;
        }
    }
}

struct trans *getTransInfo (struct trans *s,char c[50])
{
    int i;

    while (s)
    {
        i = strcmp (s->nome, c);
        if (i != 0)
        {
            s = s->next;
        } else
        {
            return s;
            break;
        }
    }
}

感谢您的时间:)