2017-01-18 8 views
1

Я не понимаю, почему следующий C-код приводит к следующему выводу.Есть ли у кого-нибудь представление о том, как происходит этот странный вывод моей программы на C?

Я хочу запрограммировать очередь массивов, и все, что я сделал allready, это написать функцию «enqueue_fct», которая добавляет новые элементы в очередь и «петли» массива.

Код:

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

#define MAX 5 

int enqueue_fct (int newElem_e, int * array_e, int last_e) 
    { 
    array_e [last_e] = newElem_e; 
    last_e = (last_e + 1) % MAX; 
    return (last_e); 
    } 

int main (void) 
    { 
    int newElem = 0; 
    int array [MAX]; 
    int last = 0; 
    int i; 

    for (i = 0; i < 20; i++) 
    { 
    last = enqueue_fct (newElem++, array, last); 
    printf ("array[%d] --> %d\n", last, array [last]); 
    fflush (stdout); 
    } 

    return (EXIT_SUCCESS); 
    } 

Выход:

array[1] --> 0 
array[2] --> -
array[3] --> 0 
array[4] --> 0 
array[0] --> 0 
array[1] --> 1 
array[2] --> 2 
array[3] --> 3 
array[4] --> 4 
array[0] --> 5 
array[1] --> 6 
array[2] --> 7 
array[3] --> 8 
array[4] --> 9 
array[0] --> 10 
array[1] --> 11 
array[2] --> 12 
array[3] --> 13 
array[4] --> 14 
array[0] --> 15 

Из пятой строки на выходе то, что я ожидал, но как насчет первых четырех строк? Я не имею в виду, почему он не начинается с «array [0]», понятно, почему это так. Но я не получаю, откуда приходит «0, -, 0, 0», прежде чем правильный вывод начнется со второго «цикла» массива.

Я новичок, так что если есть очень глупая ошибка в коде, быть снисходительным со мной и, пожалуйста, попытайтесь объяснить простыми словами, новичок может понять ;-)

Большое спасибо за ваш Помогите!

P. S .: Я использую Eclipse Neon.2 Release (4.6.2) с новейшим компилятором cygwin gcc на Windows 10 64bit.

EDIT:

Из-за 2501s ответ я исправил мой код и добавил -1 к утверждению PRINTF.

printf ("array[%d] --> %d\n", last, array [last-1]); 

Теперь есть еще одна проблема, на выходе, что я не понимаю:

array[1] --> 0 
array[2] --> 1 
array[3] --> 2 
array[4] --> 3 
array[0] --> 1 
array[1] --> 5 
array[2] --> 6 
array[3] --> 7 
array[4] --> 8 
array[0] --> 1 
array[1] --> 10 
array[2] --> 11 
array[3] --> 12 
array[4] --> 13 
array[0] --> 1 
array[1] --> 15 
array[2] --> 16 
array[3] --> 17 
array[4] --> 18 
array[0] --> 1 

Почему массив [0] всегда '1', а не '4', '9', ' 14 ',' 19 '? Когда массив «последний» становится «0» в начале цикла»: К сожалению, как я уже сказал, я новичок ...

EDIT2:

Я получил это сам [last-1] "is" array [-1] ", который не является частью массива, поэтому '1' ist junk-data.

Все начинается полное программирование нуб ;-)

+0

несвязанный .. не нужен 'fflush (стандартный вывод)'. 'printf' является буферизированным по строке, поэтому, когда он видит символ' \ n' (который у вас есть), он сбрасывает свой буфер на 'stdout'. – yano

+0

Спасибо, яно, за информацию. Уменьшает ли производительность, когда я добавляю fflush (stdout), где это не нужно? –

+0

hmm, хорошо вопрос. Вам нужно будет проверить сгенерированную сборку, но я подозреваю, что да, добавив 'fflush (stdout);' здесь добавятся дополнительные (ненужные) инструкции и, следовательно, более низкая производительность. Я не _think_ компилятор будет оптимизировать это (даже если он посмотрел на строку 'printf' и увидел' '\ n'' в конце, он должен был быть уверен, что ничего не было написано на' stdout' то время). Но я просто думаю вслух, кто-то умнее меня, мне нужно будет ответить. – yano

ответ

0

Вы не печать элемент, который был только назначен массив, но следующий. Когда printf называется переменной, последний индексирует следующий элемент.

В первых циклах MAX вы печатаете неинициализированные элементы массива, а в последующих циклах вы печатаете значения, которые были назначены в предыдущих циклах MAX.

+0

О. К., это была глупая ошибка ... Спасибо! Не могу дать вам преимущество, из-за моей низкой репутации. –

0

Это связано с тем, что перед печатью результата вы обновляете значение last.

last = enqueue_fct (newElem++, array, last); 
printf ("array[%d] --> %d\n", last, array [last]); 
fflush (stdout); 

enqueue_fct возвращает значение индекса следующего элемента в массиве (переворачивание в конце массива).Вы используете это значение для печати только что назначенного элемента, но после того, как enqueue_fct вернется, он указывает на следующий элемент.

Например, после звонка enqueue_fct в первый раз с last=0, он назначает last=1. Затем вы печатаете array[last], который является вторым элементом массива, а не первым. Поскольку массив не инициализирован, вы получите мусор.

+0

Спасибо (не могу дать вам преимущество, из-за моей низкой репутации), я исправил эту ошибку, но теперь у меня другая проблема (см. Мое редактирование первого сообщения). У вас есть решение для этого? –

+0

У меня это есть, почему это произошло (см. EDIT2). –

0

Возможно, вы имели в виду это:

int main (void) 
{ 
    int newElem = 0; 
    int array [MAX]; 
    int last = 0; 
    int i, newlast; 

    for (i = 0; i < 20; i++) 
    { 
     newlast = enqueue_fct (newElem++, array, last); 
     printf ("array[%d] --> %d\n", last, array [last]); 
     last = newlast; 
    } 

    return (EXIT_SUCCESS); 
} 
+0

Спасибо (не могу дать вам преимущество, из-за моей низкой репутации), я исправил эту ошибку, но теперь у меня другая проблема (см. Мое редактирование первого сообщения). У вас есть решение для этого? –

+0

Нет, нет, утверждение «printf (" array [% d] ->% d \ n ", last, array [last-1]); " без разницы; сохраните его так: array [last], но добавьте переменную newlast, как я сказал вам. –

+0

Да, [last-1] был моей собственной попыткой, после ответа пользователя 2501, который решил мою первую проблему, но вызвал новую. После этого я попробовал ваш ответ, и он отлично работает и остается таким образом в моей программе, спасибо. Но меня все еще интересует, почему [last-1] вызывает «1» в каждом массиве [0]. Можешь сказать мне? –