请高手帮帮我找出程序中的bug,只知道bug在running函数中。
#include "stdafx.h"#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
int j=0;
int n,i; //需要输入的作业数量
float T1=0,T2=0; //初始化周转时间,带权周转时间.
int times=0; //初始化开始运行时间
int freesa=100,disksa=5; //预定内存的大小为100k,磁带数量为5个.
struct jcb //作业控制块
{
char username[10]; //用户名
char name[10]; //作业名
int reachtime; //作业到达时间
int starttime; //作业开始时间
int runtime; //已经运行了的时间
int needtime; //作业需要运行的时间
int frees; //作业要占用的内存
int disks; //作业所需磁带
int finishtime; //作业完成时间
float cycletime; //作业周转时间
float cltime; //作业带权周转时间
char state; //作业状态
struct jcb *next; //结构体指针
}*ready=NULL,*start=NULL,*p,*q,*r,*s,*t;
typedef struct jcb JCB;
void inital() //建立作业控制块队列,先将其排成先来先服务的模式队列
{
int i;
printf("\n输入作业数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
p=getpch(JCB);
printf("\n输入用户名:");
scanf("%s",p->username);
printf("输入作业名:");
scanf("%s",p->name);
getch();
p->reachtime=i;
printf("作业默认到达时间:%d",i);
printf("\n输入作业要运行的时间:");
scanf("%d",&p->needtime);
printf("输入作业运行要占用的内存:");
scanf("%d",&p->frees);
printf("输入作业运行所需磁带:");
scanf("%d",&p->disks);
p->runtime=0;
p->state='W';
p->next=NULL;
if(ready==NULL) ready=q=p; //先将其按到达的先后顺序排成后备序列
else{
q->next=p;
q=p;
}
}
}
int space() //计算内存中作业的个数
{
int l=0; JCB* pr=start;
while(pr!=NULL)
{
l++;
pr=pr->next;
}
return(l);
}
void apply() //把符合条件的作业调用内存,并给他们分配资源,
{
int len;
//len=space();
// for(i=0,p=ready;i<3-len&&p!=NULL;)
p=ready;
while(p!=NULL)
{
if(p->frees<=freesa&&p->disks<=disksa)
{
freesa-=p->frees;
disksa-=p->disks;
// i++;
r=p;
p=p->next;
if(r==ready) //先将符合条件的作业从队列中分离出来
{
ready=r->next;
r->next=NULL;
}
else
{
q=ready;
while(q->next!=r) q=q->next;
q->next=r->next;
}
if(start==NULL) start=s=r; // 将其插到start队列,
else{
s->next=r;
s=r;
}
}
else
{
p=p->next;
}
}
len=space();
printf("\n\t此时有%d道作业在内存\n\n",len);
}
void disp(JCB * pr) /*建立作业显示函数 */
{
printf("|%s\t",pr->username);
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->reachtime);
printf("|%d\t",pr->needtime);
printf("|%d\t",pr->runtime);
printf("|%d\t",pr->frees);
printf("|%d\t",pr->disks);
printf("\n");
}
void check() //显示作业状况
{
// JCB *s,*r;
// printf("当前使用用户:%s\t正在运行的作业是:%s",q->username,q->name);
printf("\n作业%s于完成%d个作业后运行完毕,其完成后的情况:",q->name,j);
j++;
printf("\n用户名****作业名****状态****到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 \n");
disp(q);
s=start;
printf("\n\t\t*********当前进入内存的作业状态*********");
printf("\n用户名****作业名****状态****到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 \n");
while(s!=NULL)
{
disp(s);
s=s->next;
}
r=ready;
printf("*\n\n\t\t*********当前后备作业表中作业的状态**********");
printf("\n用户名****作业名****状态****到达时间*需运行时间*已运行时间*需占用内存*需磁带数量 \n");
while(r!=NULL)
{
disp(r);
r=r->next;
}
}
void running() //运行作业
{
for(t=start;t!=NULL;)
{
start=t->next;
q=t;
q->next=NULL;
q->state='R';
q->runtime++;
t=start;
times++;
if(q->runtime==q->needtime)
{
q->finishtime=times;
q->starttime=q->finishtime-q->needtime;
q->cycletime=q->finishtime-q->reachtime;
q->cltime=(q->cycletime)/(q->needtime);
T1+=q->cycletime;
T2+=q->cltime;
freesa+=q->frees;
disksa+=q->disks;
check(); //调用check()显示正在运行的,就绪的以及后备的作业信息
free(q); //释放作业
apply(); //分配作业
getch();
}
else
{
for(s=start;s->next!=NULL;) s=s->next;
s->next=q;
}
}
}
main() //初始化界面
{
int m;
printf("\n\n\t\t*********************************************\t\t\n");
printf("\t\t\t\t实验三(2) 多道作业调度\n");
printf("\t\t*********************************************\t\t\n");
printf("\n\t\t1.多道作业调度演示.");
printf("\n\t\t0.退出程序");
printf("\n\t\t\t选择所要的操作:");
printf("\n\n\n\t\t\t\t\t计算机学院软件四班\n");
printf("\t\t\t\t\t蓝小花\n");
printf("\t\t\t\t\t3204007102\n");
printf("\t\t\t\t\t完成日期:2006年12月");
scanf("%d",&m);
switch(m)
{
case 1:
system("cls");
inital();
apply();
running();
getch();
system("cls");
main();
break;
case 0:
system("cls");
break;
default:
system("cls");
main();
}
}
只知道bug在running函数中
[[it] 本帖最后由 rustle 于 2008-12-3 16:11 编辑 [/it]]