Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分段错误:在模拟锦标赛分支预测器时_C_Segmentation Fault - Fatal编程技术网

C 分段错误:在模拟锦标赛分支预测器时

C 分段错误:在模拟锦标赛分支预测器时,c,segmentation-fault,C,Segmentation Fault,我有一个锦标赛分支预测模拟作为任务。该程序模拟微处理器中的锦标赛分支预测器。我想我做的一切都对。我找不到问题所在。我陷入了分割错误 /* Shreyas Kale Computer Architecture Homework 3 Problem 1 */ /* * for global index, at first considered not taken, gi[0] --> MSB * 0 --> not taken * 1 --> taken * */ #i

我有一个锦标赛分支预测模拟作为任务。该程序模拟微处理器中的锦标赛分支预测器。我想我做的一切都对。我找不到问题所在。我陷入了分割错误

/* Shreyas Kale Computer Architecture Homework 3 Problem 1 */
/*
 * for global index, at first considered not taken, gi[0] --> MSB
 * 0 --> not taken
 * 1 --> taken
 * 
 */
#include<stdio.h>
#include<unistd.h>
#include<strings.h>

struct tables{
char msb;
char lsb;
}local[10],global[64],selector[10];

//6 bits = 64

struct global_index{
    unsigned int i : 6; //bitfield, to index global predictor
}gi = {0};
int pc = 0, correct = 0;        
    //here I mean instruction address
char localdec, globaldec, selected;

void initialise()
{
    int i,res;

    for(i=0;i<10;i++)
    {
        local[i].lsb = 'n';
        selector[i].lsb = 'n';
        local[i].msb = 'n';
        selector[i].msb = 'n';
    }
    for(i=0;i<64;i++)
    {
        global[i].lsb = 'n';
        global[i].msb = 'n';
    }
}

void main()
{
    char *sbs, *sbo, *myfile;
    FILE *fd_sbs, *fd_sbo, *fd_myfile;
    char *seq_in, *fout; // for input and output to file
    int g = 0;
    int k = 0, res;

        sbs = "sample_branch_sequence.txt"; //sample branch sequence filename
        sbo = "sample_branch_output.txt"; //sample branch output filename
        myfile = "myout.txt"; // my output filename

    initialise();
    fd_sbs = fopen(sbs,"r");
    fd_sbo = fopen(sbo,"r");
    fd_myfile = fopen(myfile,"a+");

    /* Check whether files are opened */
    if((fd_sbs == NULL) || (fd_sbo == NULL) || (fd_myfile == NULL))
    {
        printf("\n files are not opened properly, bye bye!");
        return; 
    }
    /*Actual algorithm*/
    for(k=0;k<10000;k++)
    {
        fgets(seq_in,4,fd_sbs);
        //printf("%s\n",seq_in);
        pc = atoi(seq_in[0]);
        //now branch

        //look up local
        if(local[pc].msb == 'n')
            localdec = 'n';
        else if(local[pc].msb == 't')
            localdec = 't';

        //lookup global
        g = (int)gi.i;
        if(global[g].msb == 'n')
            globaldec = 'n';
        else if(global[g].msb == 't')
            globaldec = 't';

        //look up selector
        if(selector[pc].msb == 'n')
            selected = 'g';
        else if(selector[pc].msb == 't')
            selected = 'l';
        // final decision and program direction updation of output string
        fout[0] = seq_in[0];
        fout[1] = localdec;
        fout[2] = globaldec;
        fout[3] = selected;
        fout[4] = ((selected == 'g') ? globaldec : localdec);
        fout[5] = seq_in[1];
        fout[6] = '\n';
        fout[7] = '\0';
        //put it in file

        //calculate correct predictions
        if(fout[4] == seq_in[1])
            correct += 1;

        res = fputs(fout,fd_myfile);

        if(res == EOF){
            printf("Something erroneous!!");
        }
        //update global counter
        if(seq_in[1] == 't')
        {
            gi.i = gi.i << 1;   //pust a 0 from left
            gi.i += 1;      //add 1 now so, lsb becomes 1
        }
        else if(seq_in[1] == 'n')
        {
            gi.i = gi.i <<1;    //push a 0 from left
        }
        //NOW UPDATION OF THE PREDICTORS
        if(fout[4] == seq_in[1])
        {   
            //decision correct update selector accordingly
            if(selected == 'g')
            {
                // decrement slector
                if((selector[pc].lsb == 't')&&(selector[pc].msb == 't'))
                    selector[pc].lsb = 'n';
                else if((selector[pc].lsb == 'n')&&(selector[pc].msb == 't'))
                {
                    selector[pc].msb = 'n';
                    selector[pc].lsb = 't';
                }
                else if((selector[pc].lsb == 't')&&(selector[pc].msb == 'n'))
                    selector[pc].lsb = 'n';
                else if((selector[pc].msb == 'n')&&(selector[pc].lsb == 'n'))   //cant be deremented
                    return;
            }
            else if(selected == 'l')
            {
                //increment selector

                if((selector[pc].lsb == 'n')&&(selector[pc].msb == 'n'))
                    selector[pc].lsb = 't';
                else if((selector[pc].lsb == 't')&&(selector[pc].msb == 'n'))
                {
                    selector[pc].msb = 't';
                    selector[pc].lsb = 'n';
                }
                else if((selector[pc].lsb == 'n')&&(selector[pc].msb == 't'))
                    selector[pc].lsb = 't';
                else if((selector[pc].msb == 't')&&(selector[pc].lsb == 't'))   //cant increment
                    return;
            }
            //now update other tables : local first increment
            if((local[pc].lsb == 'n')&&(local[pc].msb == 'n'))
                local[pc].lsb = 't';
            else if((local[pc].lsb == 't')&&(local[pc].msb == 'n'))
            {
                local[pc].msb = 't';
                local[pc].lsb = 'n';
            }
            else if((local[pc].lsb == 'n')&&(local[pc].msb == 't'))
                local[pc].lsb = 't';
            else if((local[pc].msb == 't')&&(local[pc].lsb == 't')) //cant increment
                return;
            //now update global : increment
            if((global[gi.i].lsb == 'n')&&(global[gi.i].msb == 'n'))
                global[gi.i].lsb = 't';
            else if((global[gi.i].lsb == 't')&&(global[gi.i].msb == 'n'))
            {
                global[gi.i].msb = 't';
                global[gi.i].lsb = 'n';
            }
            else if((global[gi.i].lsb == 'n')&&(global[gi.i].msb == 't'))
                global[gi.i].lsb = 't';
            else if((global[gi.i].msb == 't')&&(global[gi.i].lsb == 't'))   //cant increment
                return;             
        }
        else if(fout[4] != seq_in[1])   //wrong decision
        {
            //decrement local and global
            if((local[pc].lsb == 't')&&(local[pc].msb == 'n'))
                local[pc].lsb = 'n';
            else if((local[pc].lsb == 'n')&&(local[pc].msb == 't'))
            {
                local[pc].msb = 'n';
                local[pc].lsb = 't';
            }
            else if((local[pc].lsb == 't')&&(local[pc].msb == 'n'))
                local[pc].lsb = 'n';
            else if((local[pc].msb == 'n')&&(local[pc].lsb == 'n')) //cant decremet
                return;
            //now update global : decrement
            if((global[gi.i].lsb == 't')&&(global[gi.i].msb == 'n'))
                global[gi.i].lsb = 'n';
            else if((global[gi.i].lsb == 'n')&&(global[gi.i].msb == 't'))
            {
                global[gi.i].msb = 'n';
                global[gi.i].lsb = 't';
            }
            else if((global[gi.i].lsb == 't')&&(global[gi.i].msb == 'n'))
                global[gi.i].lsb = 'n';
            else if((global[gi.i].msb == 'n')&&(global[gi.i].lsb == 'n'))   //cant decrement
                return;             

        }   
    }


}

</code></pre>
/*Shreyas Kale计算机体系结构作业3问题1*/
/*
*对于全局索引,最初认为未执行,gi[0]-->MSB
*0-->未使用
*1-->已拍摄
* 
*/
#包括
#包括
#包括
结构表{
字符msb;
字符lsb;
}本地[10],全局[64],选择器[10];
//6位=64
结构全局索引{
无符号int i:6;//位字段,用于索引全局预测器
}gi={0};
int pc=0,正确=0;
//这里我指的是指令地址
char localdec,globaldec,选中;
无效初始化()
{
int i,res;
对于(i=0;i而言,在as中有seq_

char * seq_in;
稍后在fgets调用中使用。必须正确分配变量的内存,否则程序将引发分段错误。可以解决此问题:

char seq_in[200];  /* or the size you want */

同样的问题也发生在fout变量上。

您在as中有seq_

char * seq_in;
稍后在fgets调用中使用。必须正确分配变量的内存,否则程序将引发分段错误。可以解决此问题:

char seq_in[200];  /* or the size you want */


fout变量也会出现同样的问题。

void main
错误。已停止读取该变量。是否尝试使用调试工具(如gdb或valgrind)查找问题源?
void main
错误。已停止读取该变量。是否尝试使用调试工具(如gdb或valgrind)查找问题源?谢谢,这已解决,但您是否在我的返回语句中看到任何异常,因为程序正在某个地方退出。我是否必须将任何计数器增加到下一行,因为我在输出文件中只得到一行?我在数组中使用了\n'\0'字符,这是否错误?谢谢,这已解决,但您是否在retu中看到任何异常我有rn语句,因为程序正在某个地方退出。我是否必须将任何计数器增加到下一行,因为我在输出文件中只得到一行?我在数组中使用了\n'\0'字符,这是错误的吗?