Не могу понять c вывод из массива - PullRequest
0 голосов
/ 13 апреля 2019

Я не могу понять вывод этого цикла с 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, но он не выдает ошибку.

Редактировать: я работаю с тем же массивом, код которого я разместил один за другим (я пытался печатать на терминале при вызове функции внутри цикла иэто дало абсурдные значения (нет, функция вообще не изменяет значения массива), я исправил цикл, начиная с 1, а не с 0, но все еще имею ту же проблему, цикл должен быть закрыт в N, а не N-1 из-за другой функции, которую я вызываю.Я не могу опубликовать весь код, потому что: он звонит слишком долго, он разделен на несколько файлов и, самое главное, это задание в университете.Позже я попытаюсь изменить цикл, как указано в Yunnosch, и выложу результат

1 Ответ

0 голосов
/ 13 апреля 2019

Вы определили new_y_avg как массив двойных чисел в double new_y_avg[N].

Однако вы использовали неверный спецификатор формата в printf.

Вы использовали printf("new_y_avg[%d] = %f ..., в то время как спецификатор формата для double равен% lf.

Введено неопределенное поведение (UB) , что означало, что компилятор мог сделать все что угодно. Это может иногда работать, но это довольно непредсказуемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...