2013-02-13 3 views
-2

는 I 내게 세그먼트 오류를 ​​범 코드의 조각이 때 함수 loadRow (tmpPop, bestOf4Route, K, N);은 다섯 번째로 호출됩니다. 특히, 함수는 fro의 첫 번째 루프에서 올바르게 호출됩니다 (p = 3 일 때). 그것은 모든 k 값에 대해 모두 괜찮습니다. 이유를 모르겠지만 루프를 두 번 실행하면 (p = 7), 처음으로 k = 0이라고 부르면 매트릭 tmpPop에 액세스하려고 할 때 세그먼트 F가 반환됩니다.C 행렬 기능 세그먼트 오류

 randperm(popSize,randomOrder); 
     for(p = 3;p<popSize;p+=4) 
     { 
     load_rtes(rtes,pop,randomOrder,n,p); 
     load_dists(dists,totalDist,randomOrder,p); 
     find_min(dists, 4,&m,&idx); 
     for(j=0;j<n;j++) bestOf4Route[j]=rtes[j][idx]; 
     X = rand_range(1,5); 
     Y = rand_range(1,5); 
     for(k =0;k<4;k++) //Mutate the Best to get Three New Routes 
     { 
      loadRow(tmpPop,bestOf4Route,k,n); 

      switch(k) 
      { 
       case 1: //Flip 
        flipMutation(tmpPop,k,X,Y); 
        break; 
       case 2: //Swap 
        swapMutation(tmpPop,k,X,Y); 
        break; 
       case 3: //Slide 
        slideMutation(tmpPop,k,X,Y); 
        break; 
      } 
     } 
     loadnewPop(newPop,tmpPop,p,n); 
    } 

함수이다

void loadRow(int **mat,int *array,int k,int size) 
{ 
    int j; 

    for(j=0;j<size;j++) 
    { 
     mat[j][k] = array[j]; 
    } 
} 

매개 변수 :

popSize = 16

n= 8 

// create 4 x N matrix 

tmpPop = (int**)malloc(n * sizeof(int*)); 

if(tmpPop==NULL) return 1; 

for (i = 0; i < n; i++) { 

    tmpPop[i] = (int*)malloc(4 * sizeof(int)); 

    if(tmpPop[i]==NULL) return 1; 
} 

// Creates an array of n 

bestOf4Route = (int*)malloc(n * sizeof(int)); 

if(bestOf4Route==NULL) return 1; 

clear_array(bestOf4Route,n); 

그녀는 디버깅 결과 :

00,401,865 loadRow (매트 = 0x3e1438 배열 = 0x3e1698, K = 0, 사이즈 = 8)

void load_rtes(int **rtes,int **pop,int *randomOrder, int n,int p) 
{ 
    int i,j,r; 

    for(i=p-3;i<=p;i++) 
    { 
    //thakes the i element of randomOrder and use it as index for the pop row 
    r=randomOrder[i]; 
    // copy the pop row in rtes 
    for(j=0;j<n;j++) 
    { 
     rtes[j][i]=pop[j][r]; 
    } 
    } 
} 

void randperm(int n,int *perm) 
{ 
    int i, j, t; 

for(i=0; i<n; i++) 
    perm[i] = i; 
for(i=0; i<n; i++) { 
    j = rand()%(n-i)+i; 
    t = perm[j]; 
    perm[j] = perm[i]; 
    perm[i] = t; 
} 
} 
+0

당신은 또한') (기능'load_rtes를 게시 할 수 있을까? 그것을 간접적으로 사용하여'tmpPop'을 채 웁니다. –

+0

좋아, 질문에 추가했습니다! – Malo

+0

그리고 지금은 ** 어떻게 든'loadRow' 기능과 상호 작용하는 코드의 우리 ** 모두 표시해야합니다 : 당신은'randomOrder'를 초기화 코드. –

답변

0

세그먼트 폴트는 액세스가 허용되지 않은 메모리 영역을 액세스하는 것을 의미한다. 이것은 포인터 연산이 잘못되었을 때 아주 쉽게 발생할 수 있습니다. 문제가 정확히 자리하고있는 곳 내가 당신에게 말할 수 있지만 그래서, 난 당신이 매트릭스/배열의 범위를 초과하는지 k, nj 보는 좋은 디버거 또는 일부 printf() 문을 사용하는 것이 좋습니다. 또한 적절한 양의 메모리를 할당했는지 확인해야합니다.

+0

이해가 안 ... 메모리가 더 널 포인터, 아니 초기화되지 변수를 확인 보인다 ... 넌센스와 나는 값의 printf와 인쇄 j, matrix [j] [k] 및 array [j]와 모두 괜찮습니다! 이상한 것은 함수가 4 번 호출되고 아무 것도 잘못된다는 것입니다. 그런 다음 for의 새 루프에서 호출 될 때 (다시 k가 0으로 바뀜) 행렬에 액세스 할 수 없습니다 (j = 0에서 행렬 [j] [k]에서) 뭔가 잘못되었습니다. 하지만 내가 게시 한 디버그에서 볼 수있는 것처럼, 매트릭스에 대한 포인터는 null이 아니며 j = 0입니다. 실제로 나는 갇혀 있고 혼란 스럽습니다. – Malo