我正在尝试让循环调度程序正常工作,不幸的是,尽管流泪已经流泪,但它似乎仍然在我的代码中的某个地方出错。这是我的功能:
//function that processes the head of the CPU queue (RR version)
int process2 (NodePtr *headcpu, NodePtr *tailcpu, int *count, int timeslice) {
NodePtr temp2;
NodePtr temp3;
(*headcpu)->cpu_time = (*headcpu)->cpu_time - timeslice;
(*count) = (*count) + timeslice;
//if statement starts
if ((*headcpu)->cpu_time <= 0){
temp3 = dequeue_cpu(headcpu, tailcpu);
print_result (temp3, count);//call to print_result function
}//if statement ends
//else statement starts
else {
temp2 = *headcpu;
*headcpu = (*headcpu)->next;
(*tailcpu)->next = temp2;
*tailcpu = temp2;
(*tailcpu)->next = NULL;
}//else statement ends
return 0;//successful termination
}//end process2 function
这是我的输出:
3788 230 31
5001 401 39
5002 402 41
7979 461 63
7919 461 65
1008 72 75
3784 230 87
5000 400 97
7999 456 111
7909 458 115
7989 460 117
7929 462 119
Program received signal SIGSEGV, Segmentation fault.
此输出是使用36个样本长的测试文件生成的,正如您所看到的,只有少数值似乎打印出来并且不正确。我得到了一个段错误。
有人可以确定问题的根源吗?
答案 0 :(得分:1)
这看起来不错:
(*tailcpu)->next = temp2;
*tailcpu = temp2;
(*tailcpu)->next = NULL;
查看您正在做的事情 - 第一个作业将(*tailcpu)->next
设置为temp2
。从现在开始,你失去了对(*tailcpu)->next
中所有内容的引用。不仅如此,下一个任务(*tailcpu = temp2
)还会破坏你想要通过之前任务实现的任何目标。