0

編集-私は算術エラーを理解しましたが、それでもリターンエラーがあります

何らかの理由で、私のプログラムで2つのエラーが発生します。最初のエラーは、各methods()の最後にある「return」がメソッドを終了しておらず、メインに戻っていないことです。2番目の質問は23行目です。ここでpfNum=mainSize / pageSize; 「SIGFPE、算術例外」が発生しているのですが、なぜこれらの両方が発生しているのかわからないので、誰かが私を助けてくれますか?

ありがとう

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Define page table as dynamic structure containing virtual page and page frame 
   and initialize variable as pointer to structure */
struct table{
    int vp;
    int pf;
}*pageTable = NULL;
/* Declare global var's */
int mainSize,pageSize,policy,pfNum;
/**********************************************************************/
void option1(){
/* Declare local var's */
    int k;
/* Prompt for main memory size, page size, and replacement policy */
    printf("Enter main memory size(words): ");
    scanf("%d",&mainSize);
    printf("Enter page size(words/page): ");
    scanf("%d",&pageSize);
    printf("Enter replacement policy(0=LRU, 1=FIFO): ");
    scanf("%d",&policy);
    pfNum = mainSize/pageSize;
/* Allocate and initialize page table based on number of entries */
    pageTable = malloc(pfNum *sizeof(pageTable));
    for(k=0;k<pfNum;k++){
        pageTable[k].vp=-1;
        pageTable[k].pf=k;
    }
return;
}
/**********************************************************************/
void option2(){
/* Declare local var's */
    int va,page,offset,i=0,temp;
/* Prompt for virtual address */
    printf("Enter virtual memory address to access: ");
    scanf("%d",&va);
/* Translate virtual mem addr to virtual page and offset*/
    page = va/pageSize;
    offset = va%pageSize;
/* Check for end of table, unallocated entry, or matched entry in table 
and update table appropriately; while none of three cases, keep looping */

    while(i<pfNum && pageTable[i].vp!=1 && pageTable[i].vp!=page)
        i++;
    if(i<=pfNum){
        int j;
        temp = pageTable[0].pf;
        for(j=1;j<pfNum;j++)
            pageTable[j-1]=pageTable[j];
        pageTable[j].vp=page;
        pageTable[j].pf=temp;
        printf("Page Fault!");
    }
    else if(pageTable[i].vp==-1){
        pageTable[i].vp = page;
        printf("Page fault!");
    }
    else if(pageTable[i].vp==page){
        temp = pageTable[i].pf;
        int l,address;
        for(l=i+1;l<pfNum-1;l++)
            pageTable[l-1]=pageTable[l];
        pageTable[l].vp = page;
        pageTable[l].pf = temp;
        address = (temp*pageSize)+offset;
        printf("Virtual address %d maps to physical address %d",va,address);
    }
 return;
}
 /**********************************************************************/
void option3(){
 /* Declare local var's */
    int u;
    for(u=0;u<pfNum;u++ && pageTable[u].vp!=-1)
        printf("VP %d --> PF %d",pageTable[u].vp,pageTable[u].pf);
 /* Print out each valid virtual page and page frame pair in table */

 return;
}


 /**********************************************************************/
 int main(){
 /* Declare local var's */
    int choice;
 /* Until user quits, print menu of options, prompt for user input, and select     appropriate option */
    printf("/n");
    printf("Virtual memory to Main memory mapping:\n");
    printf("--------------------------------------\n");
    printf("1) Set parameters\n");
    printf("2) Map virtual address\n");
    printf("3) Print page table\n");
    printf("4) Quit\n");
    printf("\n");
    printf("Enter Selection: ");
    scanf("%d",&choice);
    printf("\n");
    while(choice!=4){
        if(choice==1)
            option1();
        else if(choice==2){
            option2();
        }
        else if(choice==3)
            option3();
    }
    printf("Goodbye. Have a nice day.");
return 1;
}
4

2 に答える 2

1

「SIGFPE、算術例外」例外は、ゼロによる除算が原因である可能性があります。

于 2012-11-03T01:15:42.183 に答える
1

1つの問題は、最初の選択を行った後、何も選択を変更しないため、プログラムがループを一周して最初の選択を実行することです(ゼロ、負の選択、または4より大きい値)。これにより、関数が「戻らない」ように見えるかもしれませんが、実際には返されます。彼らはほとんどすぐにまた呼ばれる。

おそらく、ループの前後で毎回新しい選択を求める必要があります。これは、ループから呼び出す選択をプロンプトして返す関数を提案しwhileます。

"/n"おそらく意図した場所が少なくとも1つあります"\n"。別れのメッセージに改行がありません。他の多くのメッセージ(メッセージなど"Page Fault!")も同様です。入力関数が成功したかどうかはチェックしません。メモリ割り当てが成功したことを確認しません。

SIGFPEは、おそらくゼロ除算によるものです。除算を実行する前に、処理している値を出力します。

于 2012-11-03T01:31:48.440 に答える