我正在处理一些队列代码。我试图使用全局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()的调用都是错误的。
请注意自己,使用实际指标而不是猜测。
答案 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
所做的任何更改的期望都得到满足。