2015-01-30 2 views
0

본질적으로 콤비네이션 자물쇠의 조합을 파악하려고 시도하는 프로그램을 작성하려고합니다. 나는 사용자로부터 2 개의 입력을 받았다. 다이얼 할 다이얼의 수 (나는 최대 인덱스라고 불렀다)와 각 다이얼이 갈 수있는 가장 높은 수 (나는 최대 수라고 불렀다)를 취한다. 이 두 입력을 받아들이면, 나는 무차별 적으로 자물쇠에 힘을 넣으려고합니다.C에서 반복을 사용하는 순열; Valgrind 오류

이 문제를 해결하기 위해 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가 반환됩니다. 조합을 시도 할 때마다 카운터가 감소합니다.

+0

valgrind에서 오류가 발생하는 위치는 어디입니까? valgrind에서 가장 많은 정보를 얻으려면 최적화없이 디버그 정보를 켜고 컴파일하십시오. GCC는'-g -O0'이 될 것입니다. 또는'gdb'와 같은 디버거에서 프로그램을 실행하십시오. segfault가 발생하면 정확히 어디에서 발생했는지 보여주는 스택 추적을 얻을 수 있어야합니다. –

+0

'testCombo()'가 추측을 계속할 수 있는지 여부를 결정하는 방법은 무엇입니까? 'max_number'를 모르기 때문에 가능한 모든 조합을 시도했는지 평가할 수 없습니다. –

답변

1

본질적으로 코드에 문제가있는 것을 볼 수 없습니다. 귀하의 사양에 따라 고안 한 testCombo() 기능과 함께 작동합니다.

그러나 주석에서 언급했듯이 testCombo()은 제대로 작업하기에 충분한 정보를 제공하지 못하는 것 같습니다. 또한 테스트 할 조합 (예 : max_indices)의 크기가 testCombo() 개보다 작 으면 끝에있는 부분을 읽을 가능성이 높으므로 segfault가 발생할 수 있습니다.

다른 말로하면, 나는 testCombo()에 대한 책임이 있다고 생각하지만, 당신이 제시하지 않았기 때문에 더 이상 구체적이지 않을 수 있습니다.