2016-09-08 3 views
0

Kann mir bitte jemand sagen, warum ich hier einen Segmentierungsfehler habe?C Segmentation Fault ohne Angabe von Gründen

float element(float** mat,int k, int l, int block_size){ 
int i_start=k*block_size; 
int i_end=(k+1)*block_size-1; 
int j_start=l*block_size; 
int j_end=(l+1)*block_size-1; 
float somma=0; 
int c=0; 
float media=0; 

for(;i_start<=i_end;i_start++){ 
    for(;j_start<=j_end;j_start++){ 
     somma+=mat[i_start][j_start]; 
     c++; 
    } 
} 
media=somma/c; 

return media;} 



Mat* matrixScale(Mat* m, int block_size) { 
Mat* new=(Mat*) malloc(sizeof(Mat)); 
new->rows=m->rows/block_size; 
new->cols=m->cols/block_size; 
new->row_ptrs=(float**) malloc(new->rows*sizeof(float*)); 
int i,j,z; 
for(z=0;z<new->rows;z++) 
    new->row_ptrs[z]=(float*) calloc(new->cols,sizeof(float)); 

for(i=0;i<m->rows;i++){ 
    for(j=0;j<m->cols;j++){ 
     new->row_ptrs[i][j]=elements(m->row_ptrs,i,j,block_size); 
    } 
} 
return new;} 

Ich versuchte mit einem Debugger, aber es sagt nur, dass das Problem innerhalb der Elementfunktion ist.

+0

Markieren Sie die Frage mit {c}, um weitere Helfer zu finden. –

Antwort

0

Ihre Nachricht benötigt mehr Details. Die Linie des Absturzes, die Definition von Mat, was die Absicht ist. etc.

Für die Zukunft sehen Sie, wie man ein Minimal Beispiel bildet. Mit dem C-Tag erhalten Sie auch eine schnellere Antwort. Stellen Sie sicher, eine detaillierte Frage zu posten, oder Sie werden abgelehnt und geißelt.

Es gibt mehrere Probleme mit dem Code. Das Problem scheint um die Blockgrößenvariable herum zu liegen. Das Lesen/Schreiben über das Ende des Arrays hinaus ist undefiniert und führt in der Regel zu einem Absturz. Vielleicht meintest du Teilung?

Dieses Bit ist auch seltsam.

for(i=0;i<m->rows;i++){ 
    for(j=0;j<m->cols;j++){ 
     new->row_ptrs[i][j]=elements(m->row_ptrs,i,j,block_size); 
    } 
} 

Der maximale Index der Zeilen ist [M> Zeilen/block_size] [m-> cols/block_size] aber Sie werden den ganzen Weg zu [m-Reihen] [m-> cols]. Wenn blocksize nicht 1 ist, stürzt es ab, wenn es über das Ende des Arrays hinaus schreibt.