Rotacyjny alg planowania - mam błąd, proszę o poprawki

0

Witam. Napisałem rotacyjny algorytm planowania i gdzieś muszę mieć jakiś błąd. Program się kompiluje, ale nie działa prawidłowo. Porobiłem komentarze, żebyście szybciej mogli się zorientować co miałem zamiar zrobić. Jeżeli ktoś wie, gdzie jest błąd to bardzo proszę o pomoc. Oto kod:

#include <iostream>
#define MAX_BUFOR 30
using namespace std;

void rr(int n, int t[]);

int main()
{
    int i;
    int l_proc;
    int *t;
    int *p;
    cout << "Podaj z ilu procesow ma wyliczyc czas: \n\n" << endl;
    cin >> l_proc;
    if( !(t= new int[l_proc]) ) //tablica czasu
    {
        cout << "\nERROR\n" << endl;
        cin.get();
        exit(1);
    }
    if( !(p= new int [l_proc]) ) //tablica procesow
    {
        cout << "\nERROR\n";
        cin.get();
        exit(1);
    }
    cout << "\nPodaj czas trwania tych faz:\n\n";
    for (i=0;i<l_proc;i++)
    {
        cout << i+1 << " - ";
        cin >> t[i];
    }
    for(i=0;i<l_proc;i++) p[i]=i; //dane dla tablicy indeksow procesow
    cin.get();
    cout << endl << endl;
    rr(l_proc,t);
    cin.get();
}


void rr(int l_proc, int t[])
{
    int kwant;
    cout << "Podaj kwant" << endl << endl;
    cin >> kwant;
    cout << endl;
    int i, k, j=0, ile=0, ile_czeka=0, dodajkwant;
    int reszta[MAX_BUFOR],kolejka[MAX_BUFOR];
    double srednia=0;
    for(i=0; i<l_proc; i++)//procesy kolejno uzywaja procesora nie dluzej niz okreslony kwant
    {
        if( t[i]-kwant <= 0 ) //spr. dlugosc fazy procesu
        {
            if(i==0) //tylko dla pierwszego procesu, gdyz wtedy ile_czeka=0
            {
                for(k=0; k<t[i]; k++) cout << i;
                dodajkwant=0;
            }
            else
            {
                if( dodajkwant==1 )
					ile_czeka += kwant;
                else
					ile_czeka += t[i-1];
                for(k=0; k<t[i]; k++) cout << i;
                srednia += ile_czeka;
                dodajkwant = 0;
            }
        }
        else // gdy faza procesu jest dluzsza niz kwant czasu
        {
            reszta[j] = t[i]-kwant;
            reszta[j+1] = 0;
            kolejka[j] = i;
            ile++;
            j++;
            if( i==0 )
            {
                for(k=0;k<kwant;k++) cout << i;
                cout << "*";
                dodajkwant = 1;
            }
            else
            {
                if(dodajkwant==1)
					ile_czeka+=kwant;
                else
					ile_czeka+=t[i-1];
                for(k=0; k<kwant; k++) cout << i;
                cout << "*";
                dodajkwant=1;
            }
        }
    }
    i=0;
    while( reszta[i]!=0 ) //korzystam ze znacznika
    {
        if( reszta[i]-kwant <= 0 ) //jesli warunek to proces zostanie wykonany w calosci
	    {
            if(dodajkwant==1) //tzn. ze poprzedni proces zostal przerwany i trwal kwant
				ile_czeka+=kwant;
            else
				ile_czeka+=reszta[i];
            for(k=0; k<reszta[i]; k++) cout << kolejka[i];
            dodajkwant=0;
            srednia+=ile_czeka;
        }
        else
        {
            reszta[ile] = reszta[i]-kwant;
            reszta[ile+1] = 0;
            kolejka[ile] = kolejka[i];
            ile++;
            if( dodajkwant==1 )
				ile_czeka += kwant;
            else
				ile_czeka += reszta[i-1];
            for(k=0; k<kwant; k++) cout << kolejka[i];
            cout << "*";
            dodajkwant=1;
        }
        i++;
    }
    srednia /= l_proc;
    cout << "\nSredni czas oczekiwania RR = " << srednia;
    cin.get();
    cout << "\nAby zakonczyc wcisnij ENTER\n";
}
0

dla parametrow:
proc = 10
czas = {20,20,2,2,20,20,20,2,2,20}
kwnt = 3

runtime z visual studio mowi "Stack around the variable 'kolejka' was corrupted."

i rzeczywiscie, badajac zmienna ILE w funkcji RR
{ tzn. przed while( reszta[i]!=0 ) dostaw int max_ile = 0;
i przed kolejka[ile] = kolejka[i]; dostaw max_ile = max(ile, max_ile); }
okazuje sie ze ILE dochodzi do 36. a przeciez wg definicji MAX_BUFOR miejsca jest tylko 30!

jesli wielkosc buforow hardcodeujesz a nie wytyczasz na podstawie parametrow, to licz sie z tym, ze miejsce moze se wyczerpac.. albo wyliczaj potrzebny rozmiar i rob bufory dynamiczne z dlugoscia na styk, albo badaj czy nie nastepuje przepelnienie.. w tym przypadku uszkodziles sobie ladny kawalek stosu

0

To nie jest chyba tylko kwestia bufora. Kolejkę i resztę utworzyłem dynamicznie, żeby sprawdzić, czy program będzie działał prawidłowo i niestety nie działa, tzn. nadal wyświetla nieprawidłowy średni czas oczekiwania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1