C 中重复的排列; Valgrind 错误
Permutations with Repetitions in C; Valgrind Errors
我正在尝试编写一个程序,基本上我是在尝试找出组合锁的组合。我接受来自用户的两个输入,要转动的转盘数(我称之为最大索引)和每个转盘可以转到的最高数字(我称之为最大数)。接受这两个输入,我只是想强行进入锁中。
所以为了解决这个问题,我尝试采用函数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,它将 return -2。每次尝试组合时,计数器都会递减。
我没有发现您的代码有任何本质上的错误。它适用于我,具有我根据您的规格设计的 testCombo()
功能。
但是,正如我在评论中所说,testCombo()
似乎没有提供足够的信息来正确完成其工作。此外,如果您正在测试的组合的大小(即 max_indices
)小于 testCombo()
预期的大小,那么它很可能会读取到结尾,这可能会触发段错误。
换句话说,我在责备testCombo()
,但我不能更具体,因为你没有提出。
我正在尝试编写一个程序,基本上我是在尝试找出组合锁的组合。我接受来自用户的两个输入,要转动的转盘数(我称之为最大索引)和每个转盘可以转到的最高数字(我称之为最大数)。接受这两个输入,我只是想强行进入锁中。
所以为了解决这个问题,我尝试采用函数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,它将 return -2。每次尝试组合时,计数器都会递减。
我没有发现您的代码有任何本质上的错误。它适用于我,具有我根据您的规格设计的 testCombo()
功能。
但是,正如我在评论中所说,testCombo()
似乎没有提供足够的信息来正确完成其工作。此外,如果您正在测试的组合的大小(即 max_indices
)小于 testCombo()
预期的大小,那么它很可能会读取到结尾,这可能会触发段错误。
换句话说,我在责备testCombo()
,但我不能更具体,因为你没有提出。