Нет ничего явно неправильного в коде, который вы разместили, поэтому это говорит о том, что что-то не так с кодом, который вы взяли, или в способе, которым вы вызываете код. Вам придется отладить это для себя. На этом этапе вам помогут две основные техники отладки:
Как и @KPexEA, отладка с использованием printf () или других операторов ведения журнала. Поместите printf () в начало и конец обеих функций, распечатывая столько состояний, сколько, по вашему мнению, может быть полезным.
int enqueue()
{
printf("enqueue(): Enter: size=%d\n", size);
if( size == MAX ) {
printf("enqueue(): Exit: QUEUE_FULL\n");
return QUEUE_FULL;
}
/* snip the actual queue handling */
size++;
printf("enqueue(): Exit: size=%d\n", size);
return 0;
}
int dequeue()
{
printf("dequeue(): Enter: size=%d\n", size);
if(!size) {
printf("dequeue(): QUEUE_EMPTY\n");
return QUEUE_EMPTY;
}
/* snip actual queue handling */
if(size)
size--;
printf("dequeue(): Exit: size=%d\n", size);
return 0;
}
Изучив выходные данные, должно стать очевидным, что происходит с размером вашей очереди. (Вы также можете подсчитать фактическое количество элементов в своей очереди и распечатать его при входе и выходе из своих функций.)
Другая техника - интерактивная отладка. Это особенно полезно, чтобы точно определить, как работает ваш код, но вы должны сидеть там каждый раз, когда запускаете программу, чтобы посмотреть, как она работает. (Если ваша ошибка возникает каждый раз, это легко; если она возникает время от времени, трудно вернуться назад и воссоздать поток вашей программы после факта.) Установите точку останова в начале каждой из ваших функций и используйте отладчик для отображения значения size
. Установите другую точку останова в конце каждой функции и убедитесь, что (1) точка останова действительно получена, и (2) ваши ожидания относительно любых изменений, внесенных в size
, удовлетворены.