나는 방황하는 세일즈맨 문제를 해결하기 위해 클래스 프로젝트 작업을하고 있습니다. 기본적으로 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;
}
제목이 내게 들리지 않습니까? 컴파일 중 또는 프로그램을 실행할 때 오류가 있습니까? 또한 프로그램이 끔찍한 것처럼 보이기 때문에 여기에 게시하기 전에 코드를 들여 씁니다. 지저분한 코드에 대해 유감스럽게 생각하지 말고 정리하십시오.이 코드는 스스로 이해하는 데 도움이됩니다. –
코드가 컴파일되지 않을 때 버스 오류가 발생하기 어렵습니다. 당신은'int ** realArrayPointer = v;'와 타입 불일치 오류가 있습니다. 그것은'int **'가'int [N] [M]'과 동의어가 아니고 당신이 생각한 어떤 방법 으로든 그것이 틀리기 때문입니다. 또한 적어도 하나의 메모리 누수가 있습니다 (98,99,'Answer = ...'). 다른 오류가 있다고 가정 할 수는 있지만, 그 후에는 그만 두었습니다. – WhozCraig
'BUS 오류'는 특히 소프트웨어 중심으로 들리지 않습니다. –