Вход в бесконечный цикл
Этот код предназначен для алгоритма замены страницы 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));
}
4 ответа
Я не могу проверить вашу программу, но я думаю, что ошибка:
while(ch>0 && ch<4);
попробуйте установить другое значение дляch
в fifo()
Поскольку вы не меняете значение ch
вполне возможно, что }while(ch>0 && ch<4);
будет цикл до бесконечности.
Помни что break
выходит из switch
не петля.
Вы не получаете другой символ здесь:
do{
switch(ch)
{
case 1: fifo();
break;
/*case 2: lru();
break;
case 3: opt();
break;*/
default: printf("Invalid choice!");
}
} while (ch> 0 && ch<4);
как только пользователь вводит один символ в 'ch', вы продолжаете цикл с этим бесконечным.
попробуйте добавить
scanf("%d",&ch);
незадолго до постановки "в то время"
Проще говоря: вы получаете некоторые параметры от пользователя и используете их в условном цикле. Однако в цикле вы никогда не меняете и не обновляете значения параметров. Поэтому, когда пользователь выбирает значение, которое создаст цикл, оно также будет выполнено в следующий раз, в следующий раз.... оно будет повторяться до бесконечности.
Я понимаю, что после каждого цикла вы снова хотите спросить пользователя, что он хочет сделать, если он не введет неправильный номер. Затем вы распечатываете "неверный выбор" и останавливаетесь. Самое простое, что нужно сделать, это переместить строку 26 (do{
) до строки 10 (после строки int ch;
).