【问题标题】:Variably modified at file scope [closed]在文件范围内进行可变修改[关闭]
【发布时间】:2020-05-01 03:45:58
【问题描述】:

如何解决此错误?这是由于将我的数组 pgAccess、pgArray 和 pgRequest 初始化为可变大小,这些都是整个程序中使用的全局变量。我知道某些方法中可能存在一些未声明的变量,但我想关注这些数组的问题。我在这里使用虚拟内存算法。

int flag = 0, var, currFrame = 0, numFault, currRequest, request;
int numPages, numFrames, numRequest, fc =0, go =0, c =0;
int pgAccess[numRequest], pgArray[numPages], pgRequest[numRequest];
void runningMessage(int, int, int);
void fifo();
void lru();
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 Fram %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);
        while(!feof(fp))
        {
                fscanf(fp, "%d", &pgAccess[x]);
                x++;
        }
        fclose(fp);
        printf("Algorithm: %s\n\n", argv[2]);
        if(argv[2] == "FIFO")
        {
                fifo();
        }
        if(argv[2] == "LRU")
        {
                lru();
        }
        if(argv[3] == "OPT")
        {
                opt();
        }

}

void fifo(){

        int i, x;
        for(i = 0; i < numFrames; i++)
        {
                pgArray[i] = -1;
        }
        while(x < numRequest)
        {
                flag =0;
                var = pgAccess[x];
                for(i = 0; i < numFrames; i++)
                {
                        if(var == pgArray[i])
                        {
                                flag = 1;
                                x++;
                                runningMessage(pgArray[i], i, 1);
                                break;
                        }
                }


                if(flag == 0)
                {
                        if(currFrame < numFrames)
                        {
                                pgArray[currFrame] = pgAccess[x];
                                runningMessage(pgAccess[x], currFrame, 2);
                                currFrame++;
                                x++;
                                numFault++;
                        }
                        else if( y < numFrames)
                        {
                                runningMessage(pgArray[y], y, 3);
                                pgArray[y] = pgAccess[x];
                                runningMessage(pgAccess[x], y, 2);
                                x++;
                                y++;
                                numFault++;
                                else
                                {
                                        y =0;
                                }
                        }
                }
        }
        printf(" %d Page Faults\n\n", numFault);
}


void lru(){

        int i, x, y, a, b, j;
        y = numFrames;
        for(i = 0; i < y; i++)
        {
                pgRequest[i] = 0;
                pgArray[i] = -1;
        }
        for(i = 0; i < numRequest; i++)
        {
                flag = 0;
                a = pgAccess[i];
                for(j = 0; j < y; j++)
                {
                        if(a == pgArray[j])
                        {
                                flag = 1;
                                pgRequest[j] = i;
                                runningMessage(pgArray[j], j, 1);
                                break;
                        }
                }

                if((flag == 0) && (b < y))
                {
                        fc++;
                        pgArray[b] = a;
                        pgRequest[b] = i;
                        runningMessage(pgArray[b], b, 2);
                        b++;
                }

                else if((flag == 0) && (b == y))
                {
                        fc++;
                        minRequest = pgRequest[0];
                        for(currRequest = 0; currRequest < y; currRequest++)
                        {
                                if(pgRequest[currRequest] < minRequest)
                                {
                                        minRequest = pgRequest[currRequest];
                                        request = currRequest;
                                }
                        }

                        pgArray[request] = a;
                        pgRequest[request] = i;
                        runningMessage(pgAccess[request], request, 3);
                        runningMessage(pgArray[request], request, 2);
                        request =0;
                }
        }
        printf(" %d Page Faults\n\n", fc);
}

void opt(){

        int i, x, 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);

}

【问题讨论】:

  • 首先,你必须使用 strcmp 而不是 if(argv[2] == "FIFO")
  • 你说得对,我会改的
  • How can I fix this error? 什么错误?请参阅How to create a Minimal, Reproducible Example
  • pgAcces[numRequests] 变量numRequests 在这里未定义。使用malloc
  • 很难回答你的问题,因为代码太多了。如果您可以删除与您的问题不直接相关的任何内容并创建minimal reproducible example,这将真正帮助我们。如果精简后的程序不是特别有用,那很好,只要它仍然能证明问题。例如,您可以硬编码用户输入,或用预设结果替换函数调用。这不仅仅是为了我们的利益;在创建 MRE 时,您可能会自己找出答案!

标签: c arrays variables gcc


【解决方案1】:

这里,您还没有初始化变量numRequestnumPages,而是在数组的初始化中传递它。这可能会导致您的代码出现错误。因为numRequestnumPages 可能有一些随机垃圾值,因为它们没有被初始化。

因此,要么在设置 numRequestnumPages 之后声明数组,要么采用指针而不是 this 答案中提到的数组。

【讨论】:

  • 哦,我明白你在说什么......我会让你知道发生了什么
【解决方案2】:

您仍然必须使用malloc(),只要确保您以正确的方式使用它即可。

将数组声明为指针,

int *pgAccess, *pgArray, *pgRequest;

分配时,

pgAccess=malloc(sizeof(int)*numRequest);

请注意,这不是您程序中的唯一问题。

【讨论】:

  • 我试过了,它似乎产生了更多的错误
  • 您还发现了哪些其他问题?
  • @OsayiZoom 尝试找出您在哪里为 numRequest 分配了值,无论是手动还是通过 scanf()。
  • @OsayiZoom 并注意您必须使用 strcmp() 来比较字符串,而不是 ==
  • @OsayiZoom 可能只是将 -Wall 参数传递给 gcc 并修复每个编译器警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2014-03-07
  • 2019-11-16
  • 2013-12-16
  • 2012-11-18
相关资源
最近更新 更多