2012-12-02 39 views
0

我正在掃描文件中的雙精度數組。 我可以打印此數組以檢索文件中每一行的正確值。C:掃描的雙數組值改變了原因?

我在此過程中嘗試在另一個文件中掃描另一個數組時出現問題。

我:

// 
// 

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

int main (int argc, char **argv) { 

    double c[13], d[13]; 
    char filename[20]; 
    double x1, x2, y1, y2, z1, z2, d1, d2, au, aux, auy; 
    double dx, dy, dz, nnid, chk, nn; 
    int n, b; 
    char *in; 
    in=argv[1]; 
    FILE* infile; 
    FILE* inbfile; 
    infile = fopen(in, "r"); 
    inbfile = fopen("copy.bt", "r"); 

    while (!feof(infile)) { 

    fscanf(infile, "%f %f %e %e %e %e %e %e %e %e %e %e %e %f",c,c+1,c+2,c+3,c+4,c+5,c+6,c+7,c+8,c+9,c+10,c+11,c+12,c+13); 
    printf("Selected Particle A: %f\n",c[0]); 
    n=0; 

    while (!feof(infile)) { 
     printf("%f\n",c[0]); 
     fscanf(infile, "%f %f %e %e %e %e %e %e %e %e %e %e %e %f",d,d+1,d+2,d+3,d+4,d+5,d+6,d+7,d+8,d+9,d+10,d+11,d+12,d+13); 
     printf("%f\n",c[0]); 
     printf("Selected Particle B: %f\n",d[0]); 

     /**/ 
     printf("%f = %f ?\n",c[0],d[0]); 
     if (c[0]==d[0]) { 
     printf("Same Particle SKIP...\n"); 
     } 
     else { 

     dx = (d[4])-(c[4]); 
     dy = (d[5])-(c[5]); 
     dz = (d[6])-(c[6]); 

     printf("dx dy dz %e %e %e\n",d[4],d[5],d[6]); 

     /**/ 
     if (n == 0) { 
      au=pow(((dx*dx*dx)+(dy*dy*dy)+(dz*dz*dz)),(1.0/3.0)); 
      printf("%f is %e from %f\n",c[0],au,d[0]); 
     } 
     else { 
      aux=pow(((dx*dx)+(dy*dy)+(dz*dz)),(1.0/3.0)); 
      printf("%f is %e from %f\n",c[0],aux,d[0]); 
      if (aux < au) { 
      au = aux; 
      nnid = d[0]; 
      } 
     } 
     /**/ 

     } 
     n++; 
     nn=d[1]; 
     /**/ 

    } 

    printf("%f Is Particle %f At %e\n", c[1], nnid, au); 

    } 

    fclose(infile); 
    fclose(inbfile); 
    return 0; 

} 

那麼,爲什麼值的變化?我所做的只是將另一個文件的第一行掃描到一個單獨的數組中。

+3

您需要更精確地顯示您的代碼。我們無法從那個僞代碼中看到你在做什麼。你應該瞄準一個SSCCE(一個[Short,Self-Contained,Complete Example](http://sscce.org/)),以便我們看到你在做什麼,從而給你帶來意想不到的(對你)行爲。在這種情況下,魔鬼將在變量聲明和'fscanf()'參數列表的細節中。 –

+3

加上你似乎正在使用[feof()](http://stackoverflow.com/questions/4299296/how-to-use-feoffile-f)以一種錯誤的方式。 – axiom

+2

您似乎也在以錯誤的方式使用代碼註釋。 – gspr

回答

3

您試圖將14個值讀入13個元素的數組中,導致未定義的行爲。改爲聲明陣列爲float c[14], d[14]

當你聲明dfloat d[13]d+12指向數組中的最後一個元素,並d+13是過去的陣列,以讀成是不允許它的結束。

+0

如果我能在這裏詛咒,我會的。謝謝interjay! – Protoplanet

1

要添加到Interjay的答案:您在其他地方調用未定義的行爲。您試圖使用%f格式說明符掃描double,而double的正確格式說明符是%lf

編輯:你似乎給了我們錯誤的代碼,所以上面的說法是不完全正確的。 (但是,我會保留此作爲未來訪問者的參考。)

+0

但後來我得到:警告:格式'%lf'期望輸入'double *',但參數3的類型爲'float *' – Protoplanet

+0

@Protoplanet:那麼你展示的不是你正在編譯的代碼。 –

+0

在上面的評論中,他說數組被定義爲'float c [13],d [13]',我想這就是他實際使用的版本... – interjay