c中的全局计数器未按预期工作

时间:2009-08-21 18:14:58

标签: c

我正在处理一些队列代码。我试图使用全局int来跟踪队列的大小。

#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:使代码示例与我实际编码的匹配

这不是线程化的。

编辑#2:我是个白痴,应该这样做而不是假设。 我甚至对enqueue()和dequeue()的调用都是错误的。

请注意自己,使用实际指标而不是猜测。

3 个答案:

答案 0 :(得分:2)

如果您不能使用调试器,我建议在两个函数中添加print语句,显示大小等于,然后在运行程序后检查输出。通常在查看打印日志时,问题非常明显。

答案 1 :(得分:0)

最简单的解决方案是,如果size == MAX,则不要调用“enqueue”。

但如果不可能,请试试这个:

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所做的任何更改的期望都得到满足。