Делаю лабу по ОС, модель алгоритма диспетчеризации процессов SJF. Ничего сложного, просто создаётся двусвязный список и из него выбираются процессы, которым нужно меньше всего процессорного времени. Вроде код я написал, но он через раз падает. Думаю, у меня ошибки где-то в удалении. Весь день пялюсь в код а понять почему указатели начинают указывать черти куда не могу. код:#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>//process states
#define WAITS 2
#define RUNS 3//number of proc requests
#define NUM 5 //0//process count
#define PROC_NUM 10//max cpu time
#define MAX_CT 100#define ushort unsigned short
#define uint unsigned intstruct proclst
{
ushort pid;
ushort state;
uint cputime;
};struct ff
{
struct proclst *proc;
struct ff *next;
struct ff *prev;
};struct proclst list[PROC_NUM];
struct ff *start=0, *last;struct ff *Add2FIFO( struct ff *lst, struct proclst *pr )
{
struct ff *tmp;tmp = (struct ff *)malloc( sizeof( struct ff) );
tmp->proc = pr;
tmp->next = 0;
tmp->prev = lst;
if( lst ) lst->next = tmp;
return tmp;
}//find proc with lowest cputime
struct ff *next_proc( )
{
struct ff *tmp, *z = 0;
int lowest = MAX_CT;tmp = start;
while( tmp )
{
if( tmp->proc->cputime < lowest )
{
lowest = tmp->proc->cputime;
z = tmp;
}
tmp = tmp->next;
}return z;
}void GetFromFIFO()
{
struct ff *nxt,*q;nxt = next_proc(); //find proc with lowest cpu time
while( nxt )
{
nxt->proc->state = RUNS;
printf( " pid = %d, CPU time = %d \n", nxt->proc->pid, nxt->proc->cputime );if( nxt->prev ) nxt->prev->next = nxt->next; //remove record
else //if our record starts
{ //our record is first [start], so shift start position
start = nxt->next;
if(start) start->prev = 0;
}free( nxt );
nxt = next_proc();
}}
void init()
{
int i;
srand( GetTickCount() );for( i=0; i<PROC_NUM; i++ )
{
list[i].state = WAITS;
list[i].cputime = 1 + rand() % MAX_CT; //random cpu time 1..MAX_CT
list[i].pid = i;
}
printf( " + init ok\n" );
}void createlist()
{
int i;srand( GetTickCount() );
//create fifo list
last = 0;for( i=0; i<NUM; i++ )
{
last = Add2FIFO( last, &list[rand() % PROC_NUM] ); //add random proc 2 fifo
if(!i) start = last;
}printf( " + fifo list created\n" );
}int main( int argc, char* argv[] )
{
init();
createlist();GetFromFIFO();
return 0;
}
> if( nxt->prev ) nxt->prev->next = nxt->next; //remove record
> else //if our record starts
> { //our record is first [start], so shift start position
> start = nxt->next;
> if(start) start->prev = 0;
> }Ужасный код. Это, хм, удаление должно выглядеть примерно так:
if (nxt->prev) {
nxt->prev->next = nxt->next;
}
if (nxt->next) {
nxt->next->prev = nxt->prev;
}
if (nxt == start) {
start = nxt->next;
}
if (nxt == last) {
last = nxt->prev;
}В коде еще есть мелкие ошибки. Из того что сразу заметно: в next_proc() сравнение должно быть <=, а не <.
А вообще есть такое замечательное средство как отладчик, который и нужно использовать для нахождения ошибок в коде.