2009-08-21 2 views
2

У меня есть код очереди, над которым я работал. Я пытался использовать глобальный int для отслеживания размера очереди.глобальный счетчик в c работает не так, как ожидалось

#define MAX 100 

int size=0; 
int gEnqueue=gDequeue=0; 

int enqueue() 
{ 
    gEnqueue++; 
    if(size == MAX) 
     return QUEUE_FULL; 
/* snip the actual queue handling */ 
    size++; 
    return 0; 
} 

int dequeue() 
{ 
    gDequeue++; 
    if(!size) 
     return QUEUE_EMPTY; 

/* snip actual queue handling */ 
    if(size) 
     size--; 
    return 0; 
} 

есть, конечно, гораздо больше кода, чем это, но слишком много для публикации.

Что происходит, размер застрял на максимальном установленном мною. Обе функции называются четным числом раз. Если я сброшу очередь, я вижу, что в ней всего 3 элемента.

Что может вызвать эту проблему?

редактировать # 1: сделал пример кода матч, что я на самом деле кодированный

Это не имеет резьбы.

edit # 2: Я идиот и должен был сделать это вместо того, чтобы предполагать. Я ошибался, когда звонки были даже в очереди() и dequeue().

Примечание для себя, используйте реальные показатели, не догадываясь.

+3

Как определяется MAX? –

+1

Насколько я могу судить, нам нужен еще код. (Я надеюсь, что я не пропустил ничего очевидного: 3) –

+3

Я беспокоюсь из-за отсутствия '{}' определения областей if. Не могли бы вы оставить декремент в рабочем коде? – dmckee

ответ

0

Самое простое решение - не называть «enqueue», если size == MAX.

Но если это невозможно, попробуйте следующее:

int size=0; 
int overflow=0; 

int enqueue() 
{ 
    if(size < MAX) 
     size++; 
    else 
     overflow++; 
    return 0; 
} 

int dequeue() 
{ 
    if(overflow) 
     overflow--; 
    else if(size) 
     size--; 
    return 0; 
} 
2

Если вы не можете использовать отладчик, я хотел бы предложить добавить операторы печати внутри обеих функций, показывающих, какой размер равен, а затем после запуска программы изучить вывод. Обычно при просмотре журнала печати проблема довольно очевидна.

0

Нет ничего явно неправильного с кодом, который вы опубликовали, поэтому это говорит о том, что что-то не так с кодом, который вы отрезали, или тем, как вы вызываете код. Вам придется отлаживать это для себя. Существуют два основных метода отладки, которые помогут вам на этом этапе:

Как предложено @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.

Смежные вопросы