000
31.05.2006, 18:56 Uhr
Steffen
|
Hallo, habe leider mal wieder ein Problem.
Und zwar habe ich folgendes Programm geschrieben (eine PriorityQueue), das einmal eine stl-list enthält (die funktioniert einwandfrei) und eine selbst geschriebene Array-Version (die den Fehler produziert).
Und zwar bekomme ich immer nach dem einfügen des 50 zigsten ELements einen Absturz mit der Meldung "Segmentation fault (core dumped)"
vielleicht findet ihr ja etwas...ich und mein Partner sind schon die ganze Zeit (erfolgos) auf der Fehlersuche.... Abgabetermin ist heute 24 Uhr
Hier das Programm (nur die ArrayPriorityQueue-Klasse):
C++: |
#ifndef ARRAYPRIORITYQUEUET_H_ #define ARRAYPRIORITYQUEUET_H_
#include "QueueEmptyEx.h"
template <class T> class ArrayPriorityQueueT { int gr; // Größe des Arrays int pos; // Position des zuletzt eingefügten Elements / Anzahl der eingefügten Elemente T *entries; public: // Konstruktoren ArrayPriorityQueueT():gr(50), pos(0){entries = new T[gr];}; // Destruktor ~ArrayPriorityQueueT() { delete[] entries; entries = 0; this->gr = 0; this->pos = 0; } // Kopierkonstruktor ArrayPriorityQueueT(const ArrayPriorityQueueT & a) { // cout << "Kopier-Konstruktor" << endl; this->gr = a.gr; this->pos = a.pos; this->entries = new T[this->gr]; for(int i=0; i < this->gr; i++) *(this->entries+i) = *(a.entries+i); } // Methoden void enlarge() { T *temp; int z; // Zählervariable this->gr = this->gr+50; temp = new T[this->gr]; if(this->entries != 0) { for(z = 0; z < this->gr; z++) *(temp+z) = *(this->entries+z); delete[] this->entries; } this->entries = temp; cout << "Array wurde vergroessert: " << this->gr << endl; }
void enqueue (T e) { if(this->pos >= this->gr) this->enlarge(); *(this->entries+this->pos) = e; // cout << "eingefuegt: " << *(this->entries+this->pos) << endl; siftUp(this->pos); this->pos++; }
T dequeue () throw(QueueEmptyEx) { T value; if(this->pos <= 0) throw QueueEmptyEx(); value = *(this->entries+0); *(this->entries+0) = *(this->entries+(this->pos-1)); this->pos--; siftDown(this->pos); return(value); } void siftUp(int i) // i ist der Index des betroffenen Elements { int parent; while(true) { if(i == 0) break; parent = ((i+1)/2)-1; if(*(this->entries+parent) <= *(this->entries+i)) break; swap(parent,i); i = parent; } }
void siftDown(int n) { int i = 0; int children; while(true) { children = (2*i)+1; if(children > n) break; if(children+1 <= n) { if(*(this->entries+(children+1)) < *(this->entries+children)) { children = children+1; } } if(*(this->entries+i) <= *(this->entries+children)) break; swap(children, i); i = children; } } void swap(int a, int b) // Vertausch die Array-Elemente der beiden übergebenen indizes { T tmp; tmp = *(this->entries+a); *(this->entries+a) = *(this->entries+b); *(this->entries+b) = tmp; }
};
#endif /*ARRAYPRIORITYQUEUET_H_*/
|
|