URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8192
[ Назад ]

Исходное сообщение
"Помогите пожалуйста найти ошибку в лабе"

Отправлено jcoder , 04-Апр-09 01:41 
Делаю лабу по ОС, модель алгоритма диспетчеризации процессов 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 int

struct 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;
}


Содержание

Сообщения в этом обсуждении
"Помогите пожалуйста найти ошибку в лабе"
Отправлено JohnProfic , 04-Апр-09 03:43 
>    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() сравнение должно быть <=, а не <.

А вообще есть такое замечательное средство как отладчик, который и нужно использовать для нахождения ошибок в коде.