c语言 - 在数组中查找"Empty Frame"(在 LRU 和 OS 上模拟)



我在为我的主程序设计一个可工作的助手函数时遇到了问题,我相信我的主程无法工作的问题是因为这个助手函数。

它应该循环通过一个数组,看看是否有一个空帧,即一个等于1的元素。

我有一个像这个的阵列

int freeFrames[8] = {0, 1, 1, 1, 1, 1, 1 , 1};

以及像这样的辅助功能

int findEmptyFrame(int freeFrames[])
{
int i, index;
for(i = 1; i < 8; i++)
{
printf("FreeFrame = %dn",i);  // simple print statment
if(freeFrames[i] == 1){
index = i;
return index;
}
else{
return -1;
}
}
}

当我循环通过主程序中的数组时,它只到达第一帧并返回它,并且永远不会循环通过除第一个之外的下一个元素

这是我主要调用函数的部分

else{
x = findEmptyFrame(freeFrames);
printf("X IS %dn",x );
if(x > 0){
printf("IN IF BEFORE findEmptyFramen");
PT[pageNumber].fNum = x;
PT[pageNumber].vi = 0;
frameNumber = PT[pageNumber].fNum;
PA = (frameNumber << d) + dNum;
fwrite(&PA,sizeof(unsigned long), 1, myWriteFile);
printf("The Logical Address is at %lx and Translated Physical Addres is at %lxn",LA, PA);
lruCount[frameNumber] = clock;
reverseMap[x] = pageNumber;
}

我目前得到的一个例子是这样的

IN IF BEFORE findEmptyFrame
The Logical Address is at b70 and Translated Physical Addres is at f0
FreeFrame = 1
X IS 1
发生这种情况的原因是,在for循环中,如果freeFrame[i]不等于1,则if条件失败。因此,它转到其他部分并返回-1。因此,不能在for循环中返回-1。你必须把它放回外面,如下所示:
int findEmptyFrame(int freeFrames[])
{
int i, index;
for(i = 0; i < 8; i++)
{
printf("FreeFrame = %dn",i);  // simple print statment
if(freeFrames[i] == 1){
freeFrames[i] = 0; //Change here
return i;
}
}
return -1;
}

这样做的目的是,如果数组中有1,它将返回索引。否则,整个for循环结束,然后返回-1。

此外,for循环中的索引必须从0开始。

如果您希望第一个空闲帧被标记为已使用,则在返回索引之前还必须执行此操作。检查代码的更改。

最新更新