2016-09-08 2 views
1

Я получаю сообщение об ошибке при запуске кода C, который преобразует число отсчетов в яркость температурных данных спутников. Это дает мне ошибку сегментации. Я вставляю свой код здесь. Может ли кто-нибудь предложить мне, где проблема с кодом.Ошибка сегментации (сброс ядра) для кода C

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#define N150 150 

int main(int argc, char *argv[]){ 
    int lon_tl=80, lat_tl=60; 
    int lon_br=200, lat_br=-60; 
    float lon_inc=0.04; 
    float lat_inc=0.04; 

    FILE *fp; 
    char outputfilename[N150]; 
    float tmp_NX, tmp_NY; 
    int i, j, k, nk, NX, NY, tmp_count, count[N150]; 
    short *data_all; 
    float *dt, tmp_tbb, tbb[N150]; 

    if(argc!=2){ 
    fprintf(stderr,"Usage: geoss2bt.c inputfilename1\n"); 
    fprintf(stderr," e.g.: ./geoss2bt IMG_DK01IR1_200705010030.geoss\n"); 
    exit(1); 
    } 
    tmp_NX=(lon_br-lon_tl)/lon_inc; tmp_NY=(lat_tl-lat_br)/lat_inc; 
    NX=(int)(tmp_NX); NY=(int)(tmp_NY); 
    data_all=(short*)malloc(2*NY*NX); 
    dt=(float*)malloc(4*NY*NX); 
    for(i=0;i<NY*NX;i++){ 
    data_all[i]=-999; 
    dt[i]=-999.; 
    } 

    if((fp=fopen(argv[1],"r"))==NULL){ 
    fprintf(stderr,"*** input file (%s) cannot open ***\n",argv[1]); 
    exit(1); 
    } 
    fread(data_all,sizeof(short),NY*NX,fp); 
    fclose(fp); 

    if((fp=fopen("tbbtable.txt","r"))==NULL){ 
    fprintf(stderr,"*** TBB table (tbbtable.txt) cannot open ***\n"); 
    exit(1); 
    } 
    k=0; 
    while(!feof(fp)){ 
    fscanf(fp,"%d %f",&tmp_count, &tmp_tbb); 
    count[k]=tmp_count; tbb[k]=tmp_tbb; 
    k++; 
    } 
    nk=k; 
    fclose(fp); 

    for(i=0;i<NY;i++){ 
    for(j=0;j<NX;j++){ 
    if(data_all[NX*i+j]<count[0]){ dt[NX*i+j]=-999.; } 
    else if(data_all[NX*i+j]==count[0]) { dt[NX*i+j]=tbb[0]; } 
    else{ 
     for(k=1;k<nk;k++){ 
      if(data_all[NX*i+j]<=count[k]){ 
      dt[NX*i+j]=tbb[k]-(tbb[k]-tbb[k-1])*(count[k]-data_all[NX*i+j])/(count[k]-count[k-1]); 
      goto LOOP; 
      } 
     } 
    } 
    LOOP:; 
    } 
    } 

    sprintf(outputfilename,"tbb_%s",argv[1]); 
    fp = fopen(outputfilename,"w"); 
    fwrite(dt,sizeof(float),NX*NY,fp); 
    fclose(fp); 

    free(data_all); free(dt); 
    return 0; 
} 
+0

Что такое ввод? –

+5

Прежде чем обращаться за помощью, вы на самом деле сделали какую-либо основную отладку самостоятельно. Подобно использованию отладчиков и/или отладочных операторов печати для отслеживания выполнения вашей программы. Отладчик точно скажет вам, какая строка вызывает ошибку seg для стартеров. – kaylum

+1

И вы намеренно пытаетесь понять, что ваш код трудно понять с плохим отступом, комментариями, несколькими утверждениями на линии, отсутствием пробелов между токенами, неочевидными и слишком похожими именами переменных и т. Д.? – kaylum

ответ

2

В конце кода, вы пишете:

fopen(outputfilename,"w"); 
fwrite(dt,sizeof(float),NX*NY,fp); 
fclose(fp); 

Я думаю, что это должно быть:

fp = fopen(outputfilename,"w"); 
fwrite(dt,sizeof(float),NX*NY,fp); 
fclose(fp); 

Но, код подвержен ошибкам:

  • ваш возврат malloc не проверен,
  • ваши fread возвращает не проверяются,
  • ваши fscanf возвращает не проверяются,
  • вы используете feof неправильный путь (см https://stackoverflow.com/a/4299360/1212012)
  • ...

Не стесняйтесь комментировать ваш код, он никогда не будет бесполезен.

+0

Я изменил в соответствии с вашим предложением, но все же есть сообщение об ошибке сегментации. –

+0

Благодарим вас за то, что вы указали неправильное использование feof. Я изменил команду while while (fgets (buf, 100, fp)! = NULL). Теперь он работает отлично. –

2

Я не уверен, но, возможно, это также может вызвать проблемы. По моим расчетам, вы выделялись, эти две строчек, примерно 54MB памяти:

data_all=(short*)malloc(2*NY*NX); 
dt=(float*)malloc(4*NY*NX); 

Что может привести к ошибке сегментации через переполнение стека, убедитесь, что вы установили ваш размер стека достаточно большим.

Why stack overflow causes segmentation fault instead of stack overflow in Linux?

+0

Благодарим вас за ответ. Любые предложения о том, как увеличить размер стека. –

+1

'malloc' обычно выделяет память из * кучи *. В современной ОС (Linux/Windows/OS X) выделение 54 Mb в куче не должно быть проблемой, если вы не уменьшили максимально допустимый размер процесса. –

Смежные вопросы