2016-09-08 5 views
1

Ich erhalte einen Fehler, wenn ich einen C-Code ausführen, der die Anzahl Zahl in Helligkeitstemperatur von Satellitendaten konvertiert. Es gibt mir Segmentierungsfehler. Ich gebe hier meinen Code ein. Kann mir jemand vorschlagen wo das Problem mit dem Code ist.Segmentierungsfehler (Core Dumped) für einen C-Code

#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

Was ist der Eingang? –

+5

Bevor Sie um Hilfe gebeten haben, haben Sie selbst ein grundlegendes Debugging durchgeführt. Wie die Verwendung eines Debuggers und/oder das Debug-Drucken von Anweisungen, um die Ausführung Ihres Programms zu verfolgen. Der Debugger wird Ihnen genau sagen, welche Zeile den Seg-Fehler für Starter verursacht. – kaylum

+1

Und versuchen Sie, Ihren Code mit schlechtem Einzug, ohne Kommentare, mehreren Anweisungen in einer Zeile, fehlenden Leerzeichen zwischen Tokens, nicht offensichtlichen und zu ähnlichen Variablennamen usw. zu verstehen? – kaylum

Antwort

2

In Ende-Code, schreiben Sie:

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

Ich denke, es sollte sein:

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

Aber Sie Code anfällig für Fehler ist:

Zögern Sie nicht zu kommentieren Dein Code wird niemals nutzlos sein.

+0

Ich modifizierte nach Ihrem Vorschlag, aber immer noch gibt es Segmentierung Fehlermeldung. –

+0

Vielen Dank für den Hinweis auf die falsche Verwendung von Feof. Ich habe den While-Loop-Befehl zu while geändert (fgets (buf, 100, fp)! = NULL). Es funktioniert jetzt perfekt. –

2

Ich bin mir nicht sicher, aber vielleicht kann dies auch Probleme verursachen. Nach meinen Berechnungen, die Sie zuordnen sind, ist diese zwei Linien, etwa 54MB Speicher:

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

Welche Segmentierungsfehler durch Stapelüberlauf verursachen kann, stellen Sie sicher, dass Sie setzen Ihre Stackgröße groß genug.

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

+0

Vielen Dank für die Antwort. Irgendwelche Vorschläge, wie man die Stapelgröße erhöht. –

+1

'malloc' weist normalerweise Speicher vom * heap * zu. In einem modernen Betriebssystem (Linux/Windows/OS X) sollte die Zuweisung von 54 MB auf dem Heap kein Problem darstellen, es sei denn, Sie haben die maximal zulässige Prozessgröße reduziert. –

Verwandte Themen