2012-03-31 3 views
2

0-1 초 캡슐 문제를 해결 중입니다. 나는 brute force 알고리즘으로 문제를 해결했다. MAIN.CPP에서올바른 함수를 호출하는 동안 분할 오류가 발생했습니다.

int main(int argc, char *argv[]) 
    { 
    ...... 
    int solution; 
    solution = bruteForce(); 
    ...... 
    } 

이상한 것은 내가 bruteForce() MAIN.CPP에를 구현할 때, 내 프로그램은 내가 bruteForce.cpp에 bruteForce()를 이동 한 후, 그러나 제대로 작동이다 main.cpp에 포함 시키면 프로그램은 bruteForce()를 호출 할 때 세그먼트 화 오류를 생성합니다.

다음은 bruteForce()를 bruteForce.cpp로 이동하는 방법입니다. 먼저 나는 그때 bruteForce.cpp

에 bruteForce()를 이동
#include <iostream> 
    #include <stdlib.h> 
    #include <vector> 
    #include "global.h" 
    #include "functions.h" 

    using namespace std; 

    int bruteForce() 
    { 
    int bestValue = 0; 
    int j, tempSize, tempValue; 
    int bestChoice[n+1]; 

    for(int i=0; i<multiplication(n); i++) 
    { 
     tempSize = 0; 
     tempValue =0; 
     j = n; 

     while(x[j]!=0 && j>0) 
     { 
      x[j] = 0; 
      j--; 
     } 
     x[j] = 1; 

     for(int k=1; k<=n; k++) 
     { 
      if(x[k] == 1) 
      { 
       tempSize += size[k]; 
       tempValue += value[k]; 
      } 
     } 


     if((tempValue > bestValue) && (tempSize <= S)) 
     { 
      bestValue = tempValue; 
      for(int p=1; p<=n; p++) 
       bestChoice[p] = x[p]; 
     } 
    } 
    for(int p=1; p<=n; p++) 
     x[p] = bestChoice[p]; 

    return bestValue; 
} 

functions.h: 

    #include "global.h" 
    int bruteForce(); 
    int multiplication(int); 

(나는 다른 방법으로 문제를 해결하기 원하기 때문에 한 후 성공적으로 무력을 구현)와 헤더 functions.h을 생성

#include <vector> 
    using std::vector; 

    static int n, S; 
    static vector<int> value, size, x; 

gdb를 디버거

,369을 보여줍니다 global.h에서

, 나는 몇 가지 glabal 변수 선언

Program received signal SIGSEGV, Segmentation fault. 
    0x08049308 in main() 

왜 이런 일이 발생하는지 알고 싶습니다.

미리 감사드립니다.

오 BTW, 자세한 정보가 필요하면 여기 package입니다. 먼저이 패키지의 루트에 make를 입력 할 수 있습니다. 그런 다음이 내용을 입력하여 실행하십시오.

./bin/01knapsack -BF inputs/n5S11.in n5s11.out 
+2

디버깅 기호를 얻으려면'-ggdb '로 컴파일해야합니다. 그런 다음 GDB에서 적절한 스택 추적을 얻을 수 있습니다. –

+0

실행 중 메모리 문제가 있습니다. memcpy와 비슷한 메모리 관련 문장을 사용하고 있습니까? 아니면 위의 코드와 비슷한 점이 있습니까? 그리고 별도의 폴더에 파일을 만들고 exe 그것을 시도하십시오. 귀하의 메모리에 프로그램 블록이 충돌하거나 뭔가있을 수도 있습니다. – Milee

+2

x [], size [], value [] 배열을 어디서 어떻게 선언합니까? – stanwise

답변

2

변수를 헤더 파일에 넣지 마십시오. 두 소스 파일 모두에서 해당 변수를 포함 시키면 둘 다 해당 변수의 개별 사본이 생성되므로 생각하는 방식으로 함수간에 데이터를 전송할 수 없게됩니다 (또는 적어도 어떻게해야하는지에 대한 필자의 이해입니다. 작품 - 나는 실제로 어떤 일이 일어날 지 100 % 확신하지 못한다는 것을 인정할 것이다.)

데이터를 함수로 전송하는 가장 좋은 방법은 매개 변수를 사용하는 것입니다. 필요에 따라 함수를 호출하고 함수 반환 값 또는 포인터 또는 참조 매개 변수를 통해 데이터를 반환합니다. 이런 식의 전역 변수를 사용하는 것은 오류가 발생하기 쉽기 때문에 (코드에서 보았 듯이) 다른 사람이 코드를 보는 것이 훨씬 덜 명확합니다.

당신이 절대적으로, 글로벌 변수를 사용하여 소스 파일의 하나에서 그들을 선언하고 그것의 앞에 통근 문으로 글로벌 헤더 파일에 넣어하려는 경우

. 그런 다음 다른 파일의 헤더를 포함하면 extern은 컴파일러에게 실제로 변수 자체를 작성하지 말고 다른 오브젝트 파일에서 제공한다는 사실을 컴파일러에 알립니다. MAIN.CPP에 따라서

:

int n, S; 
vector<int> value, size, x; 

그리고 세계에서

.h :

extern int n, S; 
extern vector<int> value, size, x; 
관련 문제