我试图编写一个程序,从本质上讲,我试图弄清楚组合锁的组合。我从用户那里输入了两个信息,一个是要拨的转盘数(我称之为最大索引),另一个是每个拨盘可以转至的最高数字(我称之为最大数字)。接受这两个输入,我只是试图强行进入锁中。

因此,为了解决此问题,我尝试采用openHelper函数所看到的递归方法。每次创建完整组合时,都会通过单独的功能testCombo对其进行测试,并输出三个值之一。如果组合有效,则输出1;如果组合失败并且您不能再尝试,则输出-2;如果组合失败,则输出-1,但是您可以继续猜测。

但是,当使用valgrind进行测试时,反复出现此错误:进程终止于信号11(SIGSEGV)的默认操作。

创建数组时我做错了什么,还是我设计程序的方式出了什么问题?

#include <stdio.h>
#include <stdlib.h>

int openHelper(int *input, int *output, int current_index, int max_index,
        int max_number);

int open(max_value, max_indices)
{
    int numbers[max_value];
    int test[max_indices];

    int i;
    int x;
    /* Create array of all possible numbers */
    for(i = 0; i < max_value; i++){
        numbers[i] = i;
    }
    x = openHelper(numbers, test, 0, (max_indices - 1), max_value);
    return x;
}

int openHelper(int *input, int *output, int current_index, int max_index,
        int max_number)
{
    int i;
    int x;
    for(i = 0; i < max_number; i++){
        output[current_index] = input[i];

        if(current_index == max_index){
            x = testCombo(output);
            if(x != -1){
                return x;
            }
        }
        else{
            openHelper(input, output, (current_index + 1), max_index,
                    max_number);
        }
    }
}


测试组合通过在程序中包含一个计数器来工作。因此,如果在10次尝试后将计数器设置为10,它将返回-2。每次尝试组合时,计数器都会递减。

最佳答案

我没有发现您的代码天生就有错误。它对我有用,具有我根据您的规范设计的testCombo()功能。

但是,正如我在评论中所述,testCombo()似乎没有足够的信息来正确执行其工作。而且,如果您要测试的组合的大小(即max_indices)小于testCombo()的预期大小,则很有可能读到末尾,这可能会引发段错误。

换句话说,我将责任归咎于testCombo(),但是我不能再具体了,因为您还没有介绍它。

关于c - C中带有重复的排列; Valgrind错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28241846/

10-11 15:59