模拟FIFO调度算法 ,编译通过运行崩溃 求大神相助
模拟FIFO调度算法 ,编译通过运行崩溃 求大神帮助
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<iostream>
#define ok 1;
#define error 0;
const int node = 100; //集群节点数
const int firstnode = 20;//初始阶段有多少个作业等待运行
const int maxjob = 100; //作业总数
const int cjob = 20; //允许一次生成的最大作业数
const int maxtime = 90; //允许作业申请的最大时间
const int maxnode = 90; //允许作业申请的最大节点数
typedef struct job{
int sequence;
int applytime;
int runtime;
int applynode;
int run;
struct job *next;
}job,*jobp;
struct colony{
bool occupy;//该节点是否被占用,0表示未被占用,1表示已经被占用
int occupytime;//该节点被占用的时间,其等于其上运行作业的预估时间,值随时间减小,当为0时,occupy==0
}coloy[node];
using namespace std;
int initjoblist(jobp &la){ //生成头结点
la=(jobp)malloc(sizeof(struct job));
if(!la)
exit(OVERFLOW);
la->next=NULL;
return 1;
}
void jobinsert(jobp &la,jobp &e){
if(!(la->next)){
la->next=e;
e->next=NULL;
}
else{
jobp p=la;
while(p->next)
p=p->next;
p->next=e;
e->next=NULL;
}
}
int trans(jobp &la,jobp &lb) {
if(!la->next)
return 0;
jobp p,q;
p=la;
q=lb;
p=p->next;
la->next=p->next;
while(q->next)
q=q->next;
q->next=p;
p->next=NULL;
return 1;
}
int creat(int a){
int time1=rand()%26;
int time2=rand()%39;
if(time1!=time2)
return 0;
else{
int i=rand()%cjob;
int j=maxjob-a;
if(i<=j)
return i;
else
return j;
}
}
int main(){
srand((int)time(NULL));
jobp waitqueue,runqueue,finishqueue;
int i;
int finishflag=0,finishjob=0,timeflag=0,jobnum=0,creatjob,jobflag=1;
i=initjoblist(waitqueue);
i+=initjoblist(runqueue);
i+=initjoblist(finishqueue);
if(i==3)
cout<<"作业队列已经生成开始运行:"<<endl;
for(i=0;i<node;i++){
coloy[i].occupy=0;
coloy[i].occupytime=0;
}
while(finishflag==0){
if(timeflag==0){
creatjob=firstnode;
jobnum=creatjob;
cout<<"初始阶段有"<<firstnode<<"个任务等待运行"<<endl;
}
else{
creatjob=creat(jobnum);
jobnum=jobnum+creatjob;
if(creatjob)
cout<<"在第"<<timeflag<<"秒有"<<creatjob<<"作业加入运行;"<<endl;
}
if(creatjob)
for(i=0;i<creatjob;i++){
cout<<jobflag<<":"<<"\t";
jobp a;
a=(jobp)malloc(sizeof(job));
a->applytime=rand()%maxtime+10;
cout<<"applytime="<<a->applytime<<"\t";
a->runtime=rand()%((a->applytime)/2)+((a->applytime)/2);
cout<<"runtime="<<a->runtime<<"\t";
a->applynode=rand()%maxnode+10;
cout<<"applynode="<<a->applynode<<endl;
a->sequence=jobflag;
a->run=0;
jobflag++;
jobinsert(waitqueue,a);
}
int f[100],o[100];
int j=0,k=0;
for(i=0;i<100;i++){
if(coloy[i].occupy==1){
o[j]=i;
j++;
}
else{
f[k]=i;
k++;
}
}
int freenodenum=k;
int occupynodenum=j;
while((waitqueue->next)&&((waitqueue->next)->applynode)<=freenodenum){
(waitqueue->next)->run=1;
for(i=0;i<(waitqueue->next)->applynode;i++){
coloy[f[i]].occupy=1;
coloy[f[i]].occupytime=((waitqueue->next)->applytime);
}
for(i=((waitqueue->next)->applynode);i<freenodenum;i++){
int j=0;
f[j]=f[i];
j++;
}
freenodenum=freenodenum-((waitqueue->next)->applynode);
i=trans(waitqueue,runqueue);
}
jobp p=runqueue;
while(p->next){
if(((p->next)->runtime)>0){
((p->next)->runtime)--;
if(((p->next)->runtime)==0){
((p->next)->run)=-1;
i=trans(runqueue,finishqueue);
finishjob++;
}
}
p=p->next;
}
for(i=0;i<occupynodenum;i++){
if(coloy[o[i]].occupytime>0){
coloy[o[i]].occupytime--;
if(coloy[o[i]].occupytime==0)
coloy[o[i]].occupy=0;
}
}
if(finishjob==maxjob)
finishflag=1;
timeflag++;
}
cout<<"完成"<<maxjob<<"个任务总耗时为"<<timeflag<<"秒。"<<endl;
return 0;
}
------解决思路----------------------
这种问题一般是使用F5调试运行.
然后程序崩溃时弹出的对话框 选择调试, 如果第一个对话中没有调试, 可以选择"重试" 或者"中断".
然后基本上程序就会停在出错的地方了.
一般你的程序问题都是指针错误了. 要么是野指针或者是空指针.
------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<iostream>
#define ok 1;
#define error 0;
const int node = 100; //集群节点数
const int firstnode = 20;//初始阶段有多少个作业等待运行
const int maxjob = 100; //作业总数
const int cjob = 20; //允许一次生成的最大作业数
const int maxtime = 90; //允许作业申请的最大时间
const int maxnode = 90; //允许作业申请的最大节点数
typedef struct job{
int sequence;
int applytime;
int runtime;
int applynode;
int run;
struct job *next;
}job,*jobp;
struct colony{
bool occupy;//该节点是否被占用,0表示未被占用,1表示已经被占用
int occupytime;//该节点被占用的时间,其等于其上运行作业的预估时间,值随时间减小,当为0时,occupy==0
}coloy[node];
using namespace std;
int initjoblist(jobp &la){ //生成头结点
la=(jobp)malloc(sizeof(struct job));
if(!la)
exit(OVERFLOW);
la->next=NULL;
return 1;
}
void jobinsert(jobp &la,jobp &e){
if(!(la->next)){
la->next=e;
e->next=NULL;
}
else{
jobp p=la;
while(p->next)
p=p->next;
p->next=e;
e->next=NULL;
}
}
int trans(jobp &la,jobp &lb) {
if(!la->next)
return 0;
jobp p,q;
p=la;
q=lb;
p=p->next;
la->next=p->next;
while(q->next)
q=q->next;
q->next=p;
p->next=NULL;
return 1;
}
int creat(int a){
int time1=rand()%26;
int time2=rand()%39;
if(time1!=time2)
return 0;
else{
int i=rand()%cjob;
int j=maxjob-a;
if(i<=j)
return i;
else
return j;
}
}
int main(){
srand((int)time(NULL));
jobp waitqueue,runqueue,finishqueue;
int i;
int finishflag=0,finishjob=0,timeflag=0,jobnum=0,creatjob,jobflag=1;
i=initjoblist(waitqueue);
i+=initjoblist(runqueue);
i+=initjoblist(finishqueue);
if(i==3)
cout<<"作业队列已经生成开始运行:"<<endl;
for(i=0;i<node;i++){
coloy[i].occupy=0;
coloy[i].occupytime=0;
}
while(finishflag==0){
if(timeflag==0){
creatjob=firstnode;
jobnum=creatjob;
cout<<"初始阶段有"<<firstnode<<"个任务等待运行"<<endl;
}
else{
creatjob=creat(jobnum);
jobnum=jobnum+creatjob;
if(creatjob)
cout<<"在第"<<timeflag<<"秒有"<<creatjob<<"作业加入运行;"<<endl;
}
if(creatjob)
for(i=0;i<creatjob;i++){
cout<<jobflag<<":"<<"\t";
jobp a;
a=(jobp)malloc(sizeof(job));
a->applytime=rand()%maxtime+10;
cout<<"applytime="<<a->applytime<<"\t";
a->runtime=rand()%((a->applytime)/2)+((a->applytime)/2);
cout<<"runtime="<<a->runtime<<"\t";
a->applynode=rand()%maxnode+10;
cout<<"applynode="<<a->applynode<<endl;
a->sequence=jobflag;
a->run=0;
jobflag++;
jobinsert(waitqueue,a);
}
int f[100],o[100];
int j=0,k=0;
for(i=0;i<100;i++){
if(coloy[i].occupy==1){
o[j]=i;
j++;
}
else{
f[k]=i;
k++;
}
}
int freenodenum=k;
int occupynodenum=j;
while((waitqueue->next)&&((waitqueue->next)->applynode)<=freenodenum){
(waitqueue->next)->run=1;
for(i=0;i<(waitqueue->next)->applynode;i++){
coloy[f[i]].occupy=1;
coloy[f[i]].occupytime=((waitqueue->next)->applytime);
}
for(i=((waitqueue->next)->applynode);i<freenodenum;i++){
int j=0;
f[j]=f[i];
j++;
}
freenodenum=freenodenum-((waitqueue->next)->applynode);
i=trans(waitqueue,runqueue);
}
jobp p=runqueue;
while(p->next){
if(((p->next)->runtime)>0){
((p->next)->runtime)--;
if(((p->next)->runtime)==0){
((p->next)->run)=-1;
i=trans(runqueue,finishqueue);
finishjob++;
}
}
p=p->next;
}
for(i=0;i<occupynodenum;i++){
if(coloy[o[i]].occupytime>0){
coloy[o[i]].occupytime--;
if(coloy[o[i]].occupytime==0)
coloy[o[i]].occupy=0;
}
}
if(finishjob==maxjob)
finishflag=1;
timeflag++;
}
cout<<"完成"<<maxjob<<"个任务总耗时为"<<timeflag<<"秒。"<<endl;
return 0;
}
------解决思路----------------------
这种问题一般是使用F5调试运行.
然后程序崩溃时弹出的对话框 选择调试, 如果第一个对话中没有调试, 可以选择"重试" 或者"中断".
然后基本上程序就会停在出错的地方了.
一般你的程序问题都是指针错误了. 要么是野指针或者是空指针.
------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。