Другие мои функции, которые я использовал в этой программе, отлично работают после выполнения, но у этого метода есть дамп ядра ошибки сегментации, возникающий через несколько секунд после его загрузки. Кто-нибудь может распознать проблему? Я попытался отладить и выяснить, почему это происходит только с этой функцией, и я не могу понять, почему.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int flag = 0, var, currFrame = 0, numFault, currRequest,minRequest,maxRequest ,request;
int numPages, numFrames, numRequest, fc =0, go =0, c =0;
void opt();
void runningMessage(int pg, int frame, int msg){
if(msg == 1)
{
printf("Page %d already in Frame %d\n",pg, frame);
}
if(msg == 2)
{
printf("Page %d loaded into Frame %d\n",pg, frame);
}
if(msg == 3)
{
printf("Page %d unloaded from Frame %d\n",pg, frame);
}
int main(int argc, char *argv[])
{
FILE *fp;
fp = fopen(argv[1], "r");
int x =0;
fscanf(fp, "%d %d %d", &numPages, &numFrames, &numRequest);
int pgAccess[numRequest],pgArray[numPages], pgRequest[numRequest];
while(!feof(fp))
{
fscanf(fp, "%d", &pgAccess[x]);
x++;
}
fclose(fp);
printf("Algorithm: %s\n\n", argv[2]);
var = numRequest;
if(strcmp(argv[2] ,"FIFO") == 0)
{
fifo(&pgArray, &pgAccess, numPages, numFrames, numRequest, var);
}
else if(strcmp(argv[2], "LRU") == 0)
{
lru(pgArray, pgAccess, pgRequest, numPages, numFrames, numRequest, var);
}
else if(strcmp(argv[3], "OPT") == 0)
{
opt(pgArray, pgAccess, pgRequest, numPages, numFrames, numRequest);
}
}
void opt(int *pgArray, int *pgAccess, int *pgRequest, int numPages, int numFrames, int numRequest){
int i=0, x=0, y, a;
for(i = 0; i < numFrames; i++)
{
pgRequest[i] = 0;
pgArray[i] = -1;
}
for(i = 0; i < numRequest; i++)
{
flag = 0;
a = pgAccess[i];
for(y = 0; y < numFrames; y++)
{
if(a == pgArray[y])
{
flag = 1;
runningMessage(pgArray[y], y, 1);
break;
}
}
if((flag == 0) && (x < numFrames))
{
fc++;
pgArray[x] = a;
runningMessage(pgArray[x], x, 2);
x++;
}
else if((flag == 0) && (x == numFrames))
{
fc++;
for(go = 0; go < numFrames; go++)
{
pgRequest[go] = 0;
}
for(currRequest = 0; currRequest < numFrames; currRequest++)
{
c = 0;
for(currFrame = i + 1; currFrame < numRequest; currFrame++);
{
if(pgArray[currRequest] == pgAccess[currFrame])
{
if(pgRequest[currRequest] == 0)
{
pgRequest[currRequest] = currFrame;
c = 1;
}
}
}
if(c != 1)
{
pgRequest[currRequest] = numRequest + 1;
}
}
request = 0;
maxRequest = pgRequest[0];
for(go = 0; go < numFrames; go++)
{
if(pgRequest[go] > maxRequest)
{
maxRequest = pgRequest[go];
runningMessage(pgArray[go], go, 3);
request = go;
}
}
pgArray[request] = a;
runningMessage(pgArray[request], request, 2);
}
}
printf(" %d Page Faults\n\n", fc);
}