jonasf@kuling.UUCP (Jonas "flax" Flygare) (02/22/90)
I am using lattice C++ version 1.0 and lattice C version 5.04. compiles w/o warnings/errors, when run it bombs (stack set to 200000) if I insert a char variable and cin >> `variable`; to 'step' through the program it runs fine... So, if anyone out there know what's wrong with it, please tell me.. ------------------------------------test.cc----------------- #include <stream.h> #include "derlist.h" main() { derlist f(1), g(2), h(3), i(4), *p; cout << "append\n"; f.append(g); cout << "append\n"; f.append(h); cout << "append\n"; f.append(i); cout << "append\n"; p=&f; cout << "assign\n"; do { cout << "value = " << p->getvalue() << "\n"; p=(derlist*)p->next(); } while (p->next()!=p); cout << "loop\n"; g.unlink(); cout << "unlink\n"; p=&f; cout << "assign\n"; do { cout << "value = " << p->getvalue() << "\n"; p=(derlist*)p->next(); } while (p->next()!=p); } ------------------------------------linkage.h----------------- // File linkage: linkage specs for my list objects. // Linkage: Doubly linked. Beginning and end signalled with self ref. #ifndef LINKAGE_DEFINED class linkage { protected: linkage *prev_node; linkage *next_node; public: linkage(linkage* p=NULL, linkage* n=NULL); // bombed here! virtual ~linkage(); linkage* next(); linkage* prev(); linkage& getnext(); linkage& getprev(); virtual void append(linkage& nod); virtual void insert(linkage& nod); virtual void append(linkage* nod); virtual void insert(linkage* nod); void unlink(); linkage& first(); linkage& last(); virtual linkage* find(linkage* node, int (*fun)(linkage*, linkage*)=NULL); }; #define LINKAGE_DEFINED #endif LINKAGE_DEFINED ------------------------------------linkage.cc----------------- #include <stream.h> #include "linkage.h" linkage::linkage(linkage* a, linkage* b) { prev_node=(a) ? a : this; next_node=(b) ? b : this; } linkage* linkage::next() { return next_node; } linkage* linkage::prev() { return prev_node; } linkage& linkage::getnext() { return *next_node; } linkage& linkage::getprev() { return *prev_node; } void linkage::append(linkage& nod) { if (next_node==this) // have end of list, insert node { next_node=&nod; nod.prev_node=this; } else next_node->append(nod); } void linkage::insert(linkage& nod) { if (prev_node==this) { prev_node=&(nod.last()); (nod.last()).next_node=this; } else { prev_node->next_node=&(nod.first()); (nod.first()).prev_node=prev_node; prev_node=&(nod.last()); (nod.last()).next_node=this; } } void linkage::append(linkage* nod) { if (next_node==this) // have end of list, insert node { next_node=nod; nod->prev_node=this; } else next_node->append(nod); } void linkage::insert(linkage* nod) { if (prev_node==this) { prev_node=&(nod->last()); (nod->last()).next_node=this; } else { prev_node->next_node=&(nod->first()); (nod->first()).prev_node=prev_node; prev_node=&(nod->last()); (nod->last()).next_node=this; } } void linkage::unlink() { next_node->prev_node=prev_node; prev_node->next_node=next_node; next_node=prev_node=this; delete this; } linkage::~linkage() { if (prev_node!=this) { prev_node->next_node=prev_node; } if (next_node!=this) delete next_node; } linkage& linkage::first() { if (prev_node==this) return *this; else return prev_node->first(); } linkage& linkage::last() { if (next_node==this) return *this; else return next_node->last(); } linkage* linkage::find(linkage* node, int (*fun)(linkage*, linkage*)) { if (fun) { if ((*fun)(node, this)) return this; else if (next_node!=this) return next_node->find(node, fun); else return NULL; } else // generic comparison! if (node==this) return this; else return next_node->find(node,fun); } ------------------------------------derlist.h----------------- #include "linkage.h" #ifndef DERLIST_DEFINED class derlist : public linkage { private: int value; public: derlist(int a=0); int getvalue() {return value;} void append(linkage&); void insert(linkage&); void append(linkage*); void insert(linkage*); void append(derlist&); void insert(derlist&); linkage* find(linkage*, int (*fun)(linkage*, linkage*) = NULL); }; #define DERLIST_DEFINED #endif DERLIST_DEFINED ------------------------------------derlist.cc----------------- #include <stream.h> #include "derlist.h" derlist::derlist(int a) : (NULL, NULL) { value=a; } linkage* derlist::find(linkage* nod, int (*fun)(linkage*, linkage*)) { if (fun) { if ((*fun)(nod, (linkage*)this)) return (linkage*)this; else if (next_node!=(linkage*)this) return next_node->find(nod, fun); else return NULL; } else // generic comparison! if (((derlist*)nod)->value==this->value) return (linkage*)this; else return next_node->find(nod,fun); } void derlist::append(linkage& l) { linkage::append(l); } void derlist::append(linkage* l) { linkage::append(l); } void derlist::append(derlist& l) { linkage::append((linkage*) &l); } void derlist::insert(linkage& l) { linkage::insert(l); } void derlist::insert(linkage* l) { linkage::insert(l); } void derlist::insert(derlist& l) { linkage::insert((linkage*) &l); } -- jonasf@kuling.docs.uu.se : "Doedth eddydthig dthrike you adth dthrayge Jonas (flax) Flygare : aboud dthidth houdth?" -- Dirk Gently