Witam,
Mam oto taki sobie kodzik:
#include <iostream>
using namespace std;
class Kolejka {
public:
void create();
void put(int k);
int get();
bool notempty();
void clear();
Kolejka();
void increase();
private:
int n;
int *tab;
int start;
int end;
int temp;
};
Kolejka::Kolejka(){
n = 5;
temp = 0;
tab = new int[n];
}
bool Kolejka::notempty(){
return end!=start;
}
void Kolejka::create(){
start = 0;
end = 0;
int zadanie;
int liczba;
do{
cout << "Wybierz zadanie: " << endl;
cout << "1. Dodaj liczbe do kolejki" << endl;
cout << "2. Zdejmij pierwszy element z kolejki" << endl;
cout << "3. Wyczysz kolejke" << endl;
cout << "0. Zakoncz program" << endl;
cin >> zadanie;
switch(zadanie){
case 0: cout << "Nastepuje zamkniecie programu" << endl; break;
case 1: cout << "Podaj liczbe, ktora chcesz dodac do kolejki: ";
cin >> liczba;
put(liczba);
break;
case 2:
if(notempty()){
cout << "Zdjety element: " << get() << endl;
}
else{
cout << "Brak elementow! Kolejka pusta" << endl;
}
break;
case 3: clear(); break;
}
} while(zadanie);
}
void Kolejka::clear(){
for(int i=0; i<n; i++){
tab[i] = 0;
}
start = 0;
end = 0;
}
void Kolejka::put(int k){
tab[end] = k;
if((end+1)%n == start){ cout << "powiekszam"; increase();} // powiekszanie tablicy o 10
end = (end+1)%n;
}
int Kolejka::get(){
if(notempty()){
temp = tab[start];
//tab[start]=0;
start = (start+1)%n;
return temp;
}
else return 0;
}
void Kolejka::increase(){
int *tempTab = new int[n+10];
for(int i=0; i<n;i++){
tempTab[i] = tab[i];
}
n = n + 10;
delete [] tab;
tab = tempTab;
delete [] tempTab;
}
int main(){
Kolejka* FIFO = new Kolejka();
FIFO->create();
system("PAUSE");
return 0;
}
Program ma na celu utworzenie tablicy jednowymiarowej, początkowo o wielkości 5. Zmienna start to wskaznik poczatku bloku danych, end - koniec. Metoda put() odpowiada za wstawienie do kolejki w odpowiednim miejscu (http://en.wikipedia.org/wiki/Circular_buffer) elementu typu int, która jest parametrem tej metody. Zawsze pozostaje jedno miejsce wolne w tablicy, aby nie dopuścić do sytuacji, w której nie będzie można rozpoznać czy bufor jest pusty czy pełny (start = end w obu przypadkach). Jeśli zostaje już tylko to jedno miejsce wolne to tablica zostaje powiększona (odpowiada za to metoda increase() wywoływana w funkcji put() pod warunkiem (end+1)%n == start. Co do poprawnosci metody increase() wlasnie nie mam pewnosci czy jest dobrze wykonana. Ma ona stworzyc nowa tymczasowa tablice wieksza od poprzedniej o 10, skopiowac do niej wszystkie wartosci ze starej tablicy, skasowac stara tablice i utworzyc nowa o powiekszonym rozmiarze i ponownie skopiowac dane, tylko ze tym razem z tymczasowej do tej "nowej" a na koncu usunac tymczasowa. get() pobiera pierwszy element w buforze (jako że FIFO -> first in first out).
Program kompiluje sie poprawnie, jednak gdy dodaje wieksza liczbe elementow do buforu to program sie wykrzacza. Nie moge odnalezc w debbugerze zadnych informacji, ktore naprowadzilyby mnie na trop gdzie jest blad. Czasami dzieje sie to przy dodaniu 14 elementu, czasami 23, ale tylko i wylacznie przy dodawaniu liczby do kolejki.
Mam nadzieje, ze wypowiedzialem sie dosyc jasno i przejrzyscie :) Pisze w Visual C++ 2008. Bylbym wdzieczny gdyby ktos skopiowal ten kod zrodlowy, odpalil u siebie i pomogl mi odnalezc i naprawic blad ;)
Dodam, ze dopiero zaczynam swoja zabawe w programowaniu obiektowym.
Pozdrawiam