所以我有以下代码:
struct list_el{
int val;
struct list_el * next;
};
typedef struct list_el item;
...
我在prev
中有一个值列表,我希望使用此列表对其进行分析。我的意思是,它是int
的列表,因此每个int
表示一个令牌。它是一个语法分析器。
所以我想逐步分析它。像这样:
if (program(prev)){
printf("SINTAX OK.\n");
system("PAUSE");
return EXIT_SUCCESS;
}else{
printf("Error.\n");
system("PAUSE");
return EXIT_FAILURE;
}
program
:
int program(item *list){
if (list->val == 11) list = list->next;
else return 0;
while (list->val == 13) datEst(list);
if (list->val == 12) list = list->next;
else return 0;
if (list == NULL) return 1;
else return 0;
}
datEst
:
int datEst(item *list){
if(list->val == 13){
list = list->next;
return 1;
}else return 0;
}
所以事情是它在没有使用while (list->val == 13) datEst(list);
的情况下正常工作,但是当它必须使用datEst
时它会失败。
我认为这是一个深刻的问题,但我不确定。
任何线索或建议?提前谢谢你,抱歉我的英语不好。
答案 0 :(得分:0)
while (list->val == 13) datEst(list);
如果list->val
等于13
,将保持无限循环。
您正在修改list
中的datEst
,但这只是变量的本地副本。它不会更改list
中program
指向的内容。
可能的解决方案:
while (list && list->val == 13) list = list->next;
答案 1 :(得分:0)
一个选项是改变
int datEst(item *list){
if(list->val == 13){
list = list->next;
return 1;
}else return 0;
}
到
int datEst(item& list){
if(list.val == 13){
list = list.next;
return 1;
}else return 0;
}
这会将list
转换为通过引用传递的参数,这可能是您想要的。
答案 2 :(得分:0)
c没有引用,但它有指针指针
int datEst(item ** listRef)
{
item* list = *listRef; // dereference the first pointer to get a local list
if(list->val == 13)
{
list = list->next;
*listRef = list; // store the new list value
return 1;
}else return 0;
}
并且需要像这样调用:
while (list != NULL && list->val == 13)
{
datEst( &list );
}