====== Pole ====== #include #include "lexer.h" /* Pole */ // template < class T > class Pole { public: typedef double T; int cnt; T * data; Pole () : cnt (0), data (nullptr) { } Pole (int cnt0) : cnt (cnt0) { data = new T [cnt]; } void alloc (int n); ~Pole () { if (data != nullptr) delete [] data; } T& operator [ ] (int inx); }; Pole::T & Pole::operator [ ] (int inx) { if (inx < 0 || inx >= cnt) throw runtime_error ("Bad index"); return data [inx]; } void Pole::alloc (int n) { if (data != nullptr) delete [] data; cnt = n; data = new T [cnt]; } /* List */ struct Item; struct List { Item* first; Item* last; void insertLast (Pole::T val); List () : first (nullptr), last (nullptr) { } }; struct Item { Pole::T value; Item* next; }; void List::insertLast (Pole::T val) { Item* t = new Item; t->value = val; t->next = nullptr; if (last != nullptr) // pokud seznam neni prazdny last->next = t; // pripojime novy prvek za posledni prvek last = t; // posledni bude novy prvek if (first == nullptr) // pokud byl seznam prazdny first = t; // prvni bude take novy prvek } /* cteni pole */ void readVec (Lexer& inp, Pole & pole) { List list; inp.checkSeparator ('['); int k = 0; while (!inp.isSeparator (']')) { double num = inp.readNumber (); k++; list.insertLast (num); if (!inp.isSeparator (']')) inp.checkSeparator (','); } inp.checkSeparator (']'); pole.alloc (k); int i; Item* p; for (i = 0, p = list.first ; p != nullptr ; i++ , p = p->next) { pole.data [i] = p->value; } } int main() { Pole a; Lexer inp ("abc.txt"); readVec (inp, a); try { a [10] = 10; } catch (runtime_error err) { cout << "Neco se nepovedlo: " << err.what () << endl; } for (int i = 0; i < a.cnt; i++) cout << i << " ... " << a [i] << endl; cout << "O.K."; return 0; }