简体   繁体   中英

Can't understand c output from an array

I can't understand the output of this loop, with 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);
}

which gives the following output:

    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 

whilst the following code:

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);

gives a resonable output:

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 

Being that printing to file works (and the output is reasonable with the rest of my code) the problem should not be new_y_avg . Thus I don't understand why in the first loop one line gives new_y_avg[60] = -nan and one gives new_y_avg[60]= 0.009836 . I tried running it with valgrind but it gives no error.

Edit: I am working with the same array the code I posted are one after the other (I tried printing on terminal when calling a function inside of loop and it gave absurd values (no the function doesn't change the values of the array at all)), I corrected the loop starting from 1 instead of 0 but still have the same problem, the loop needs to be closed at N and not N-1 because of other another function I'm calling. I cannot post the whole code because: it's calling too long, its divided in multiple file and most important it's an assignment at university. Later I'll try changing the loop as stated by Yunnosch and post the result

You defined new_y_avg as an array of double floats in double new_y_avg[N] .

However, you used the incorrect format specifier at printf.

You used printf("new_y_avg[%d] = %f ... while the format specifier for double is %lf.

It introduced undefined behaviour (UB) which meant the compiler could have done anything. It might work sometimes but it is quite unpredictable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM