2013-02-13 101 views
-2

我有這段代碼,當我的函數loadRow(tmpPop,bestOf4Route,k,n)給出了我的SEGMENTATION FAULT;被稱爲第五次。特別是,函數在第一個循環(在p = 3時)被正確調用。對於每個k值都可以。我不明白爲什麼,當我第二次執行循環(p = 7)時,第一次被稱爲(k = 0),當它嘗試訪問基類tmpPop時返回SEGMENTATION 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); 

而且她這是調試結果:

00401865 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'。 – 2013-02-13 12:06:54

+0

好吧,我已將它添加到問題中! – Malo 2013-02-13 13:06:54

+0

現在你初始化'randomOrder'的代碼:)你需要向我們展示**所有**代碼,這些代碼以某種方式與這個'loadRow'函數交互。 – 2013-02-13 13:46:46

回答

0

段錯誤意味着你訪問你不允許訪問的存儲器區域。當指針算術錯誤時,這很容易發生。所以,雖然我不能告訴你問題到底在哪裏,但我建議您使用一個好的調試器或一些printf()語句來查看k,nj以查看是否超出矩陣/數組的界限。此外,您需要確保分配了適量的內存。

+0

我使用了code :: blocks的調試器,並且用printf打印了值j,矩陣[j] [k]和數組[j],它們都可以!奇怪的是,這個函數被調用了4次,沒有出錯。然後,當它在for的新循環中調用時(所以k再次變爲0),我不能訪問矩陣(在j = 0中,所以在矩陣[j] [k]中)出現了問題。但正如你從我發佈的調試中可以看到的,指向矩陣的指針不爲null,j = 0。真的,我被卡住了,並且感到困惑 – Malo 2013-02-13 10:17:39