簡體   English   中英

無法理解數組的 c 輸出

[英]Can't understand c output from an array

我無法理解這個循環的輸出,N=64:

int t;
double new_y_avg[N];
/* ... */
for(t = 0; t<N; t++){
    printf("new_y_avg[%d] = %f \t new_y_avg[%d] = %f \t new_y_avg[%d]= %f \n",
        ((t+1)%N), new_y_avg[(t+1)%N],
        t,         new_y_avg[t%N],
        ((t-1)%N), new_y_avg[(t-1)%N]
    );
    fflush(stdout);
}

這給出了以下輸出:

    new_y_avg[1] = 0.164471      new_y_avg[0] = 0.429837     new_y_avg[-1]= -13.421363 
new_y_avg[2] = 0.062036      new_y_avg[1] = 0.164471     new_y_avg[0]= 0.429837 
new_y_avg[3] = 0.023910      new_y_avg[2] = 0.062036     new_y_avg[1]= 0.164471 
new_y_avg[4] = 0.009836      new_y_avg[3] = 0.023910     new_y_avg[2]= 0.062036 
new_y_avg[5] = 0.004009      new_y_avg[4] = 0.009836     new_y_avg[3]= 0.023910 
new_y_avg[6] = 0.001817      new_y_avg[5] = 0.004009     new_y_avg[4]= 0.009836 
new_y_avg[7] = -nan      new_y_avg[6] = 0.001817     new_y_avg[5]= 0.004009 
new_y_avg[8] = -nan      new_y_avg[7] = 0.000410     new_y_avg[6]= 0.001817 
new_y_avg[9] = -nan      new_y_avg[8] = -0.000260    new_y_avg[7]= 0.000410 
new_y_avg[10] = -nan     new_y_avg[9] = -0.000787    new_y_avg[8]= -0.000260 
new_y_avg[11] = -nan     new_y_avg[10] = -0.001049   new_y_avg[9]= -0.000787 
new_y_avg[12] = -nan     new_y_avg[11] = -0.001614   new_y_avg[10]= -0.001049 
new_y_avg[13] = -nan     new_y_avg[12] = -0.001979   new_y_avg[11]= -0.001614 
new_y_avg[14] = -nan     new_y_avg[13] = -0.001137   new_y_avg[12]= -0.001979 
new_y_avg[15] = -nan     new_y_avg[14] = -0.000353   new_y_avg[13]= -0.001137 
new_y_avg[16] = 0.000516     new_y_avg[15] = -0.000379   new_y_avg[14]= -0.000353 
new_y_avg[17] = -nan     new_y_avg[16] = 0.000516    new_y_avg[15]= -0.000379 
new_y_avg[18] = -nan     new_y_avg[17] = 0.000855    new_y_avg[16]= 0.000516 
new_y_avg[19] = -nan     new_y_avg[18] = 0.000209    new_y_avg[17]= 0.000855 
new_y_avg[20] = 0.000199     new_y_avg[19] = 0.000190    new_y_avg[18]= 0.000209 
new_y_avg[21] = -nan     new_y_avg[20] = 0.000199    new_y_avg[19]= 0.000190 
new_y_avg[22] = -nan     new_y_avg[21] = 0.000304    new_y_avg[20]= 0.000199 
new_y_avg[23] = -nan     new_y_avg[22] = -0.000368   new_y_avg[21]= 0.000304 
new_y_avg[24] = -nan     new_y_avg[23] = 0.000930    new_y_avg[22]= -0.000368 
new_y_avg[25] = -nan     new_y_avg[24] = -0.000782   new_y_avg[23]= 0.000930 
new_y_avg[26] = -nan     new_y_avg[25] = -0.002568   new_y_avg[24]= -0.000782 
new_y_avg[27] = -nan     new_y_avg[26] = -0.001959   new_y_avg[25]= -0.002568 
new_y_avg[28] = -nan     new_y_avg[27] = -0.001674   new_y_avg[26]= -0.001959 
new_y_avg[29] = -nan     new_y_avg[28] = -0.001250   new_y_avg[27]= -0.001674 
new_y_avg[30] = -nan     new_y_avg[29] = -0.000087   new_y_avg[28]= -0.001250 
new_y_avg[31] = -0.000031    new_y_avg[30] = -0.000804   new_y_avg[29]= -0.000087 
new_y_avg[32] = -nan     new_y_avg[31] = -0.000031   new_y_avg[30]= -0.000804 
new_y_avg[33] = -0.000031    new_y_avg[32] = 0.000537    new_y_avg[31]= -0.000031 
new_y_avg[34] = -nan     new_y_avg[33] = -0.000031   new_y_avg[32]= 0.000537 
new_y_avg[35] = -0.000087    new_y_avg[34] = -0.000804   new_y_avg[33]= -0.000031 
new_y_avg[36] = -nan     new_y_avg[35] = -0.000087   new_y_avg[34]= -0.000804 
new_y_avg[37] = -0.001674    new_y_avg[36] = -0.001250   new_y_avg[35]= -0.000087 
new_y_avg[38] = -nan     new_y_avg[37] = -0.001674   new_y_avg[36]= -0.001250 
new_y_avg[39] = -nan     new_y_avg[38] = -0.001959   new_y_avg[37]= -0.001674 
new_y_avg[40] = -nan     new_y_avg[39] = -0.002568   new_y_avg[38]= -0.001959 
new_y_avg[41] = -nan     new_y_avg[40] = -0.000782   new_y_avg[39]= -0.002568 
new_y_avg[42] = -nan     new_y_avg[41] = 0.000930    new_y_avg[40]= -0.000782 
new_y_avg[43] = -nan     new_y_avg[42] = -0.000368   new_y_avg[41]= 0.000930 
new_y_avg[44] = -nan     new_y_avg[43] = 0.000304    new_y_avg[42]= -0.000368 
new_y_avg[45] = -nan     new_y_avg[44] = 0.000199    new_y_avg[43]= 0.000304 
new_y_avg[46] = -nan     new_y_avg[45] = 0.000190    new_y_avg[44]= 0.000199 
new_y_avg[47] = -nan     new_y_avg[46] = 0.000209    new_y_avg[45]= 0.000190 
new_y_avg[48] = 0.000516     new_y_avg[47] = 0.000855    new_y_avg[46]= 0.000209 
new_y_avg[49] = -nan     new_y_avg[48] = 0.000516    new_y_avg[47]= 0.000855 
new_y_avg[50] = -nan     new_y_avg[49] = -0.000379   new_y_avg[48]= 0.000516 
new_y_avg[51] = -nan     new_y_avg[50] = -0.000353   new_y_avg[49]= -0.000379 
new_y_avg[52] = -0.001979    new_y_avg[51] = -0.001137   new_y_avg[50]= -0.000353 
new_y_avg[53] = -nan     new_y_avg[52] = -0.001979   new_y_avg[51]= -0.001137 
new_y_avg[54] = -nan     new_y_avg[53] = -0.001614   new_y_avg[52]= -0.001979 
new_y_avg[55] = -nan     new_y_avg[54] = -0.001049   new_y_avg[53]= -0.001614 
new_y_avg[56] = -nan     new_y_avg[55] = -0.000787   new_y_avg[54]= -0.001049 
new_y_avg[57] = -nan     new_y_avg[56] = -0.000260   new_y_avg[55]= -0.000787 
new_y_avg[58] = -nan     new_y_avg[57] = 0.000410    new_y_avg[56]= -0.000260 
new_y_avg[59] = -nan     new_y_avg[58] = 0.001817    new_y_avg[57]= 0.000410 
new_y_avg[60] = -nan     new_y_avg[59] = 0.004009    new_y_avg[58]= 0.001817 
new_y_avg[61] = -nan     new_y_avg[60] = 0.009836    new_y_avg[59]= 0.004009 
new_y_avg[62] = -nan     new_y_avg[61] = 0.023910    new_y_avg[60]= 0.009836 
new_y_avg[63] = -nan     new_y_avg[62] = 0.062036    new_y_avg[61]= 0.023910 
new_y_avg[64] = -nan     new_y_avg[63] = 0.164471    new_y_avg[62]= 0.062036 

而以下代碼:

binned_file = fopen("binned_avg.txt","w+");
for(t=0;t<N;t++){
    fprintf(binned_file,"%d \t %f \n",
        t,new_y_avg[t]);
}
fclose(binned_file);

給出了合理的輸出:

0    0.429837 
1    0.164471 
2    0.062036 
3    0.023910 
4    0.009836 
5    0.004009 
6    0.001817 
7    0.000410 
8    -0.000260 
9    -0.000787 
10   -0.001049 
11   -0.001614 
12   -0.001979 
13   -0.001137 
14   -0.000353 
15   -0.000379 
16   0.000516 
17   0.000855 
18   0.000209 
19   0.000190 
20   0.000199 
21   0.000304 
22   -0.000368 
23   0.000930 
24   -0.000782 
25   -0.002568 
26   -0.001959 
27   -0.001674 
28   -0.001250 
29   -0.000087 
30   -0.000804 
31   -0.000031 
32   0.000537 
33   -0.000031 
34   -0.000804 
35   -0.000087 
36   -0.001250 
37   -0.001674 
38   -0.001959 
39   -0.002568 
40   -0.000782 
41   0.000930 
42   -0.000368 
43   0.000304 
44   0.000199 
45   0.000190 
46   0.000209 
47   0.000855 
48   0.000516 
49   -0.000379 
50   -0.000353 
51   -0.001137 
52   -0.001979 
53   -0.001614 
54   -0.001049 
55   -0.000787 
56   -0.000260 
57   0.000410 
58   0.001817 
59   0.004009 
60   0.009836 
61   0.023910 
62   0.062036 
63   0.164471 

由於打印到文件有效(並且我的其余代碼的輸出是合理的),問題不應該是new_y_avg 因此,我不明白為什么在第一個循環中,一行給出new_y_avg[60] = -nan而另一行給出new_y_avg[60]= 0.009836 我嘗試使用 valgrind 運行它,但沒有出現錯誤。

編輯:我正在使用相同的數組,我發布的代碼一個接一個(我嘗試在循環內調用函數時在終端上打印,它給出了荒謬的值(沒有該函數不會更改數組的值) all)),我更正了從 1 而不是 0 開始的循環,但仍然有同樣的問題,循環需要在 N 而不是 N-1 處關閉,因為我正在調用另一個函數。 我無法發布整個代碼,因為:它調用的時間太長,它分為多個文件,最重要的是它是大學的作業。 稍后我將嘗試更改 Yunnosch 所述的循環並發布結果

您將 new_y_avg 定義為double new_y_avg[N]的雙浮點數數組。

但是,您在 printf 中使用了不正確的格式說明符。

您使用了printf("new_y_avg[%d] = %f ...而 double 的格式說明符是 %lf。

它引入了未定義行為 (UB) ,這意味着編譯器可以做任何事情。 它有時可能會起作用,但它是非常不可預測的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM