2016-09-08 42 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

在尋求幫助之前,您是否真的自己做過任何基本的調試。就像使用調試器和/或調試打印語句來跟蹤程序的執行一樣。調試器會告訴你究竟是哪一條線路導致啓動器發生故障。 – 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); 

但是,你的代碼是容易出錯:

不要猶豫評論你的代碼,它永遠不會無用。

+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應該不會成爲問題,除非您減少了允許的最大進程大小。 –