我正在尝试为我的大学项目编写程序该程序应该做先到先得调度我已经考虑了很多关于这个功能但我不知道如何制作它工作,我总是得到分段错误:11 ,我也尝试使用 temp.at(j),但它给了我分段错误:6 ,我试图最小化矢量,以便通过声明函数外的向量来限制它,然后使用 temp.size()而不是进程但它也没用。
void FCFS(Process ProcessDetails[], int Processes)
{
vector<int> temp;
vector<int> temp1;
int first = 0; //first value to compare with.
for(int j = 0; j < Processes; j++){ // to make sure that it passes through all elements.
for(int i = 0; i < Processes; i++){ // pass each PID and Burst time to vector temp and temp1.
if(ProcessDetails[i].ArrivalTime == first){
temp.operator[](j) = ProcessDetails[i].PID;
temp1.operator[](j) = ProcessDetails[i].BurstTime;
}
}
first++;// increase first value to declare the round is finished and start a new one.
}
for(int i = 0; i < Processes; i++){ // pass the sorted vector values back to the arrays.
ProcessDetails[i].PID = temp.operator[](i);
ProcessDetails[i].BurstTime = temp1.operator[](i);
}
}
程序运行正常,直到达到此功能,请帮助。
答案 0 :(得分:2)
答案 1 :(得分:2)
如果向量的operator[]()
用于访问不存在的元素,则其行为是未定义的。
由于您使用了默认构造的向量,因此它们的大小为零 - 因此它们没有要访问的元素。
如果使用.at()
成员函数,它将检查索引并在索引无效时抛出异常(类型为std::out_of_range
,在标准头<stdexcept>
中声明) 。您可以通过将代码包装在适当的try
/ catch
块中来确认。
要消除此问题,您需要在使用push_back()
之前重新调整向量的大小(例如,使用resize()
向其添加元素,使用operator[]()
调整大小等)。并确保索引有效,因为operator[]()
未调整std::vector
。
此外,temp[j]
相当于temp.operator[](j)
。对于提供operator[]()
函数的类型,编译器会将temp[j]
之类的表达式转换为temp.operator[](j)
的调用。
答案 2 :(得分:0)
您必须将矢量分配更改为
if(ProcessDetails[i].ArrivalTime == first){
temp.push_back(ProcessDetails[i].PID);
temp1.push_back(ProcessDetails[i].BurstTime);
}