再次提问。 我正在创建一个递归函数,它将查找“源”规则数组中的元素,并在“源”规则类型与目标字符相同时将这些规则应用于规则的“目标数组”。此外,该函数检查目标字符是否在符号数组中,如果不符号则添加它(并在新应用的规则上抛出一些标志)。这都是由递归调用驱动的,该调用使用计数器来确定已经传递了多少次迭代,并用于确定应该应用新规则的目标数组中的点,因此我们不会覆盖。
我已经添加了一些调试代码来显示结果。
这是函数本身:
//Recursively tack on any non terminal pointed elements
int recursiveTack(rule * inrule[], char target, rule * targetrule[],
int counter, char symbols[])
{
printf("Got into recursiveTack\n");
printf("target is %c\n", target);
printf("counter is %d", counter);
for (int k = 0; k < sizeof(inrule); k++)
{
if (inrule[k]->type == target)
{
//doublecheck to see if we're trying to overwrite
if (targetrule[counter]->used = true)
{
counter++;
}
targetrule[counter]->head = inrule[k]->head;
targetrule[counter]->type = inrule[k]->type;
targetrule[counter]->used = true;
//Check to see if the elements are new to the symbols table and need to be added
if (!contains(returnGotoChar(targetrule[counter]), symbols))
{
//If not then add the new symbol
addChar(returnGotoChar(targetrule[counter]), symbols);
//Also set the goto status of the rule
targetrule[counter]->needsGoto = true;
//Also set the rule's currentGotoChar
targetrule[counter]->currentGotoChar = returnGotoChar(
targetrule[counter]);
}
counter++;
//recursivly add elements from non terminal nodes
if (isNonTerm(targetrule[counter]))
{
char newTarget = returnGotoChar(targetrule[counter]);
counter = recursiveTack(inrule, newTarget, targetrule, counter,
symbols);
}
}
}
//return how many elements we've added
return counter;
}
这是电话:
if(isNonTerm(I[i+first][second]))
{
printf("Confirmed non termainal\n");
printf("Second being passed: %d\n", second);
//Adds each nonterminal rule to the rules for the I[i+first] array
second = recursiveTack(I[i], targetSymbol, I[i+first], second, symbols[first]);
}
传入的所有数组都已在此之前初始化。 但是,我得到的输出表明递归在它离开之前在某处被杀死。
输出:
Second being passed: 0
Confirmed non termainal
Got into recursiveTack
target is E
Segmentation fault
任何帮助都会很棒,如果需要大约700行,包括评论,我也可以使用其他程序。我很确定这只是遗漏一些简单的事情,但让我知道你的想法。
答案 0 :(得分:1)
for(int k = 0; k < sizeof(inrule); k++)
sizeof(inrule)
将返回指针类型(4或8)的大小。可能不是你想要的。如果要使用这些类型的结构,还需要将数组的大小作为参数传递。
最好使用标准库容器,例如std::vector
。
答案 1 :(得分:0)
if(targetrule[counter]->used = true){
counter++;
}
//什么是targettrule [counter]实际有效的保证?你可以在它之前和之后进行printf调试吗?
答案 2 :(得分:0)
我在这里看到的最重要的事情是:
for(int k = 0; k < sizeof(inrule); k++)
这不符合您的想法。 inrule是一个指针数组,因此sizeof(inrule)将是元素的数量* sizeof(rule *)。这可能很快导致阵列结束。
尝试将其更改为:
for (int k = 0; k < sizeof(inrule) / sizeof(rule*); ++k)
你可能会考虑的其他事情是fflush(stdout);在您的打印声明之后。当一些输出仍然被缓冲时,你正在崩溃,所以它很可能隐藏在发生崩溃的地方。
编辑:
那不行。如果你有一个像以下那样的函数:
int x[10];
for (int i = 0; i < sizeof(x) / sizeof(int); ++i) ...
它可以工作,但在函数调用的另一端,类型降级为int *,而sizeof(int *)与sizeof(int [10])不同。您需要传递大小,或者......更好的是,使用向量而不是数组。