2014-12-06 3 views
-3

나는 방황하는 세일즈맨 문제를 해결하기 위해 클래스 프로젝트 작업을하고 있습니다. 기본적으로 TSP이지만, 소스로 돌아 가지 않습니다. 나는 일련의 정점들의 모든 가능한 순열을 찾은 다음 반복적으로 길이를 계산하고 그것들을 비교하여 가장 작은 것을 찾는 접근법을 취했습니다. 저는 이것이 최선의 방법이 아니라 우리 교수가 원했던 것임을 압니다.BUS 오류 : 10 C 프로그램을 컴파일하는 동안

아래 코드를 실행하면 입력 배열이 7 X 7 미만일 때 제대로 작동하고 올바른 답변을 얻을 수 있습니다. 그러나 7 X 7 일 때 "Bus Error : 10"을 반환하고 크기가 12 x 12이면 "Segmentation Fault : 11"을 반환합니다. 나는이 문제들을 몇 시간 동안 들여다 보았고 무엇이 잘못되었는지를 알 수 없었다. 나는 C 프로그래밍의 전문가가 아니며 솔직히 말해서 포인터와 혼동을 느낀다. 도와 줘서 정말 고마워, 크게 감사드립니다!

아, 지저분한 코드에 대해 사과드립니다.

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


int x = 0; 
int a[]; 


void swap (int v[], int i, int j) { 
    int  t; 

    t = v[i]; 
    v[i] = v[j]; 
    v[j] = t; 
} 

/* recursive function to generate permutations */ 
int* perm (int v[], int n, int i) { 
    /* this function generates the permutations of the array 
    * from element i to element n-1 
    */ 
    int  j; 

    /* if we are at the end of the array, we have one permutation 
    * we can use (here we print it; you could as easily hand the 
    * array off to some other function that uses it for something 
    */ 
    if (i == n) { 
      for (j=0; j<n; j++){ a[x] = v[j]; x++;} // printf ("%d ", v[j]); 
    //  printf ("\n"); 

    } 
    else 
      /* recursively explore the permutations starting 
      * at index i going through index n-1 
      */ 
      for (j=i; j<n; j++) { 
/* try the array with i and j switched */ 

        swap (v, i, j); 
        perm (v, n, i+1); 

        /* swap them back the way they were */ 

        swap (v, i, j); 
      } 

        return a; 
} 





int fact(int n){ 

if(n==1){ 
return 1; 
} 

else{ 
return n * fact(n-1); 
} 

} 


int findShortestPath(int **v , int length){ 


int pathArrayMultiplier = 0; 

int ShortestPathLength = 99999; 

printf("Called"); 

int arrayOfVertices[length-1]; 

for(int i=0 ; i<length-1 ; i++){ 


arrayOfVertices[i] = i+2; 

} 

int n = fact(length-1); 

bool doBreak = false; 

int pathArray[length-1]; 

//printf(" Called 3"); 
printf(" %d" , n); 
int* Answer; 
Answer = malloc(sizeof(int *)); 
Answer = perm(arrayOfVertices , length-1 , 0); 


printf("Called 4"); 

int j =-1; 

for(int i=0 ; i< n*(length-1) ; i++){ 
doBreak = false; 
j++; 
printf("%d " , *(Answer + i)); 
pathArray[j] = *(Answer+i); 



if(j == length-2) 
{ 
j = -1; 
// Check for negative values. If any value is negative, disregard path 
int checklength = *((int *)v + 0 *length + (pathArray[0]-1)); 
if(checklength < 0){ 
printf("First check called"); 

    continue;} 

for(int i =0 ; i<length-2 ; i++){ 
if(*((int *)v + (pathArray[i]-1) * length + (pathArray[1 + i]-1)) < 0){ 
doBreak = true; 
printf("Second Check called"); 
break;} 
    } 
    if(doBreak) { pathArrayMultiplier++; continue;} 


printf("\n"); 

int pathLength = *((int *)v + 0 *length + (pathArray[0]-1)); 

    for(int i =0 ; i<length-2 ; i++){ 

pathLength = pathLength + *((int *)v + (pathArray[i]-1) * length + (pathArray[1 + i]-1));} 

     printf("Path Length is %d\n" , pathLength); 
    if(pathLength < ShortestPathLength) { ShortestPathLength = pathLength;} 

} 

} 
printf("\n\n Shortest Path Length is %d \n" , ShortestPathLength); 
return ShortestPathLength; 
} 












int main() { 
    int len = 5; 
    printf("Array is initialized"); 
    int  v[7][7] = {0,7,-1,10,1,-1,-1,7,0,-1,-1,10 ,-1 ,1,-1,-1,0,10,1,10,-1,10,-1,10, 0,8,-1,-1,-1,10,1,8,0,10,-1,-1,-1,10,-1,10,0,70,-1,1,-1,-1,-1, 70 , 0}; 
    printf("Array is initialized"); 
    int **realArrayPointer = v; 
    findShortestPath(realArrayPointer, 7); 
    return 0; 
    } 
+0

제목이 내게 들리지 않습니까? 컴파일 중 또는 프로그램을 실행할 때 오류가 있습니까? 또한 프로그램이 끔찍한 것처럼 보이기 때문에 여기에 게시하기 전에 코드를 들여 씁니다. 지저분한 코드에 대해 유감스럽게 생각하지 말고 정리하십시오.이 코드는 스스로 이해하는 데 도움이됩니다. –

+0

코드가 컴파일되지 않을 때 버스 오류가 발생하기 어렵습니다. 당신은'int ** realArrayPointer = v;'와 타입 불일치 오류가 있습니다. 그것은'int **'가'int [N] [M]'과 동의어가 아니고 당신이 생각한 어떤 방법 으로든 그것이 틀리기 때문입니다. 또한 적어도 하나의 메모리 누수가 있습니다 (98,99,'Answer = ...'). 다른 오류가 있다고 가정 할 수는 있지만, 그 후에는 그만 두었습니다. – WhozCraig

+0

'BUS 오류'는 특히 소프트웨어 중심으로 들리지 않습니다. –

답변

0

코드가 엉망이며 실제로 읽을 수 없습니다. 그러나, 나는 당신의 버그를 발견 할 수 있는지에 대한 도전으로 나 자신을 지켰다.

int a[]; 

다음이 배열에 쓰기 : 내가 본 것은 당신이 상단에 빈 배열을 선언한다는 것입니다

a[x] = v[j]; 
x++; 

당신도 어디서든 다시 0으로 x를 재설정하지 않습니다. 기본적으로 처음부터 할당되지 않은 메모리에 쓰고 있지만 입력 값이 클수록 할당하지 않은 메모리가 많아집니다.

코드에 다른 문제가있을 수 있습니다. 포인터를 잘못 이해했다는 것을 분명히 알았지 만, 치명적인 오류를 일으키는 것은 아닙니다. 최소한 코드를 읽을 수 있도록 자동 들여 쓰기 프로그램을 설치하십시오.

+0

노력에 감사드립니다. 지저분한 코드에 대해 다시 사과드립니다. 그 프로젝트가 월요일에 만기가 된 것뿐입니다. 그리고 나는 코드 작업에 초점을 맞추 었습니다. 많은 미학이 아닙니다. 나는 내가 여기에 올린 다음번에 코드를보다 깨끗하게 보일 수 있도록 명확히 설명 할 것이다. 다시 감사합니다! –