2011-05-27 17 views
0

我擁有以下部分C代碼使用來自文件名WMM.COF的數據並使用存儲在文件中的數據來計算磁場地球。該程序完美工作,除非我不能讓程序訪問外部文件;我想讓所有的數據都存儲在程序中。我嘗試使用結構數組來複制數據,然後將數組放入字符串中,但這會導致程序中出現錯誤,並且不會產生正確的結果。這裏是我試圖修改的程序的代碼。將數據存儲在程序中而不是外部文件中

static void E0000(int IENTRY, int *maxdeg, double alt, double glat, double glon, double time, double *dec, double *dip, double *ti, double *gv) 
{ 
    static int maxord,i,icomp,n,m,j,D1,D2,D3,D4; 
    static double c[13][13],cd[13][13],tc[13][13],dp[13][13],snorm[169], 
    sp[13],cp[13],fn[13],fm[13],pp[13],k[13][13],pi,dtr,a,b,re, 
    a2,b2,c2,a4,b4,c4,epoch,gnm,hnm,dgnm,dhnm,flnmj,otime,oalt, 
    olat,olon,dt,rlon,rlat,srlon,srlat,crlon,crlat,srlat2, 
    crlat2,q,q1,q2,ct,st,r2,r,d,ca,sa,aor,ar,br,bt,bp,bpp, 
    par,temp1,temp2,parp,bx,by,bz,bh; 
    static char model[20], c_str[81], c_new[5]; 
    static double *p = snorm; 
    char answer; 

    FILE *wmmdat; 


    wmmdat = fopen("WMM.COF","r"); 

/* INITIALIZE CONSTANTS */ 
    maxord = *maxdeg; 
    sp[0] = 0.0; 
    cp[0] = *p = pp[0] = 1.0; 
    dp[0][0] = 0.0; 
    a = 6378.137; 
    b = 6356.7523142; 
    re = 6371.2; 
    a2 = a*a; 
    b2 = b*b; 
    c2 = a2-b2; 
    a4 = a2*a2; 
    b4 = b2*b2; 
    c4 = a4 - b4; 

/* READ WORLD MAGNETIC MODEL SPHERICAL HARMONIC COEFFICIENTS */ 
    c[0][0] = 0.0; 
    cd[0][0] = 0.0; 

    fgets(c_str, 80, wmmdat); 


S3: 
    if (fgets(c_str, 80, wmmdat) == NULL) goto S4; 

/* CHECK FOR LAST LINE IN FILE */ 
    for (i=0; i<4 && (c_str[i] != '\0'); i++) 
    { 
     c_new[i] = c_str[i]; 
     c_new[i+1] = '\0'; 
    } 
    icomp = strcmp("9999", c_new); 
    if (icomp == 0) goto S4; 
/* END OF FILE NOT ENCOUNTERED, GET VALUES */ 
sscanf(c_str,"%d%d%lf%lf%lf%lf",&n,&m,&gnm,&hnm,&dgnm,&dhnm); 

    if (n > maxord) goto S4; 
    if (m > n || m < 0.0) 
    { 
     fprintf(stderr, "Corrupt record in model file WMM.COF\n"); 
     exit(1); 
    } 

    if (m <= n) 
    { 
     c[m][n] = gnm; 
     cd[m][n] = dgnm; 
     if (m != 0) 
     { 
      c[n][m-1] = hnm; 
      cd[n][m-1] = dhnm; 
     } 
    } 
    goto S3; 

/* CONVERT SCHMIDT NORMALIZED GAUSS COEFFICIENTS TO UNNORMALIZED */ 
S4: 
    *snorm = 1.0; 
    fm[0] = 0.0; 
    for (n=1; n<=maxord; n++) 
    { 
     *(snorm+n) = *(snorm+n-1)*(double)(2*n-1)/(double)n; 
     j = 2; 
     for (m=0,D1=1,D2=(n-m+D1)/D1; D2>0; D2--,m+=D1) 
     { 
      k[m][n] = (double)(((n-1)*(n-1))-(m*m))/(double)((2*n-1)*(2*n-3)); 
      if (m > 0) 
      { 
       flnmj = (double)((n-m+1)*j)/(double)(n+m); 
       *(snorm+n+m*13) = *(snorm+n+(m-1)*13)*sqrt(flnmj); 
       j = 1; 
       c[n][m-1] = *(snorm+n+m*13)*c[n][m-1]; 
       cd[n][m-1] = *(snorm+n+m*13)*cd[n][m-1]; 
      } 
      c[m][n] = *(snorm+n+m*13)*c[m][n]; 
      cd[m][n] = *(snorm+n+m*13)*cd[m][n]; 
     } 
     fn[n] = (double)(n+1); 
     fm[n] = (double)n; 
    } 
    k[1][1] = 0.0; 

    otime = oalt = olat = olon = -1000.0; 
    fclose(wmmdat); 
    return; 

,我想出了一個代碼,包括數據的程序如下:

struct wmm 
     { 
     int alpha; 
     int beta; 
     float gamma; 
     float delta; 
     float epsilon; 
     float zeta; 
     }book[90]= {{1, 0, -29496.6, 0.0, 11.6, 0.0}, 
    {1, 1, -1586.3, 4944.4,  16.5,  -25.9}, 
    {2, 0, -2396.6,  0.0,  -12.1,  0.0}, 
    {2, 1, 3026.1, -2707.7,  -4.4,  -22.5}, 
    {2, 2, 1668.6, -576.1,  1.9,  -11.8}, 
    {3, 0, 1340.1,  0.0,  0.4,  0.0}, 
    /* 50+ similar lines of code */ 
{12, 8, -0.4,  0.1,  0.0,  0.0}, 
{12, 9, -0.4,  0.3,  0.0,  0.0}, 
{12, 10,  0.2,  -0.9,  0.0,  0.0}, 
{12, 11, -0.8,  -0.2,  -0.1,  0.0}, 
{12, 12,  0.0,  0.9,  0.1,  0.0}}; 





for (i = 0; i < 90 && offset < buf_size; i++) 
    { 
    offset += snprintf(c_str + offset,buf_size - offset, "%d %d %7.1lf %7.1lf %7.1lf %7.1lf \n", book[i].alpha, book[i].beta , book[i].gamma , book[i].delta, book[i].epsilon, book[i].zeta); 
    } 


    sscanf(c_str,"%d%d%lf%lf%lf%lf",&n,&m,&gnm,&hnm,&dgnm,&dhnm); 

問題是snprintf的導致程序每次它被放置在時間凍結和終止該程序。當我編寫的代碼自己運行時,它似乎會正確創建c_str,除非當我嘗試查看變量n,m,gnm,hnm,dgnm和dhnm時,每個變量只顯示一個值。

+0

我不確定,我很迷茫,因爲我只是試圖將數據轉換成程序放入外部數據的相同形式。您如何將數據合併到程序中? – officerkrupke 2011-05-27 17:37:20

+0

'...... q,q1,q2,ct,st,r2,r,d,ca,sa,aor,ar,br,bt,bp,bpp ...'有一個荒謬的局部變量是不好的。爲變量使用非常短的名字是不好的。要有兩個東西是...(單詞失敗) – leonbloy 2011-05-27 19:19:28

回答

1

由於評論中缺少空格/格式,我需要繼續回答。

首先,你必須90項,但你可以讓編譯器弄不清book陣列多少條目需要:

struct wmm { 
    int alpha; 
    int beta; 
    float gamma; 
    float delta; 
    float epsilon; 
    float zeta; 
} book[] = { 
    {1, 0, -29496.6, 0.0, 11.6, 0.0}, 
    {1, 1, -1586.3, 4944.4, 16.5, -25.9}, 
    /* ... */ 
    {12, 12,  0.0, 0.9, 0.1, 0.0} 
}; 

而且,更重要的是,你並不需要將它們放在一個字符串,和他們拉背出來時,你已經有他們的手:

for(i = 0; i < sizeof(book)/sizeof(book[0]); ++i) { 
    n = book[i].alpha; 
    m = book[i].beta; 
    gnm = book[i].gamma; 
    hnm = book[i].delta; 
    dgnm = book[i].epsilon; 
    dhnm = book[i].zeta; 
    /* Do whatever you need to do with the above variables. */ 
} 

這將整齊地邊踩任何緩衝區溢出你與你的snprintf造成。

您的c_str只是一個char[81]而且您正在通過您的循環90次,並將您的偏移每次增加到c_str;所以,你會在c_str的末尾跑掉,然後你會告訴snprintf塗抹所有未分配的內存。因此你的段錯誤。

+0

這似乎是完全適用於我的用途,但似乎只有最後一個數據條目被存儲爲每個變量爲n,m,gnm等。任何想法如何能夠在每次迭代時添加下一個數據點,而不是每次迭代覆蓋最後一個數據點? – officerkrupke 2011-05-31 12:43:44

+0

@officerkrupke:這可能是因爲你沒有用你的真實代碼替換'/ *做任何... * /'註釋。 – 2011-05-31 15:39:06

+0

傻我!這似乎已經成功了!感謝您的幫助 – officerkrupke 2011-05-31 16:05:50

相關問題