【问题标题】:Entering infinite loop进入无限循环
【发布时间】:2014-04-11 11:07:49
【问题描述】:

此代码用于页面替换 'FIFO' 算法。

当我运行代码时,它会进入一个无限循环并且不会结束。我试图搜索它,但我无法识别它。

代码:

#include <stdio.h>

int i,numOfPages,frameSize,frames[10],pages[30];
void fifo();
//void lru();
//void opt();

int main(){
int ch;

printf("\nEnter the total number of pages: ");
scanf("%d",&numOfPages);

printf("\nEnter the seq of pages: ");
for(i=0;i<numOfPages;i++)
    scanf("%d",&pages[i]);

printf("\nEnter the frame size: ");
scanf("%d",&frameSize);

printf("\n***MENU***");
printf("\n1.FIFO \t2.LRU \t3.OPT");
printf("\n\nEnter the choice: ");
scanf("%d",&ch);

do{
    switch(ch)
    {
        case 1: fifo();
            break;
        /*case 2: lru();
            break;
        case 3: opt();
            break;*/
        default: printf("Invalid choice!");

    }
}while(ch>0 && ch<4);

return 0;
}



void fifo(){

int currNum,pindex=0,findex=0,faults=0,flag;

for(i=0;i<frameSize;i++)
    frames[i] = -1;

while(pindex < numOfPages){

    flag=1;
    currNum = pages[pindex];

    for(i=0;i<frameSize;i++)
    {
        if(currNum==frames[i])
        {
            pindex++;
            flag=0;
            break;
        }
    }

    if(flag==1)
    {
    if(findex < frameSize)
    {
        frames[findex] = pages[pindex];
        pindex++;
        findex++;
        faults++;
    }else{
        findex = 0;
    }
    }

printf("\nCurrent Frames: ");
for(i=0;i<frameSize;i++)
    printf("%d \t",frames[i]);

}


printf("\n\nTotal number of page faults are: %d and Total number of page hits are: %d",faults,(numOfPages-faults));

}  

【问题讨论】:

  • 如果 ch 是 b/w 1 和 3,'do' 循环将永远不会结束
  • 我认为您应该在 while 循环中获取用户输入。

标签: c loops fifo page-replacement


【解决方案1】:

由于您不更改ch 的值,}while(ch&gt;0 &amp;&amp; ch&lt;4); 很可能会无限循环。

请记住,break 退出了 switch不是循环。

【讨论】:

    【解决方案2】:

    我无法测试你的程序,但我认为错误是:

    while(ch>0 && ch<4);
    

    尝试在fifo() 中为ch 设置不同的值

    【讨论】:

      【解决方案3】:

      你没有在这里得到另一个字符:

      do{
      switch(ch)
      {
          case 1: fifo();
              break;
          /*case 2: lru();
              break;
          case 3: opt();
              break;*/
          default: printf("Invalid choice!");
      
      }
      

      }while(ch>0 && ch

      一旦用户在 'ch' 中输入了一个字符,你就会一直循环使用这个 infinitley。

      尝试添加

      scanf("%d",&ch);
      

      就在'while'语句之前

      【讨论】:

        【解决方案4】:

        简单地说:您从用户那里获取一些参数并在条件循环中使用它们。但是在循环中,您永远不会更改或更新参数值。因此,当用户选择一个将创建循环的值时,它也会在下一次,下一次......它循环直到无穷大。

        我知道,在每次循环之后,您都想再次询问用户它想要做什么,除非它输入了一个无效的数字。然后你打印出“无效的选择”并停止。最简单的做法是将第 26 行(do{)移动到第 10 行(在int ch; 行之后)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多