<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Bus Error]]></title><description><![CDATA[<p>Hallo</p>
<p>ich muss ein programm online abgeben. lokal funktioniert alles jedoch wenn ich es online abgebe und der ein unit test durchgeführt wird kommt der fehler bus error. und ich kann diesen fehler nicht finden. bitte um hilfe.</p>
<pre><code class="language-cpp">#ifndef EXTHASHING_H
#define EXTHASHING_H

#include &lt;iostream&gt;
#include &lt;cmath&gt;
#include &quot;Container.h&quot;

template&lt;typename E&gt;
class ExtHashing: public Container&lt;E&gt; {

	class Bucket {
	public:
		int noKeys;
		int bucketDepth;
		E** keys;
		bool visited;

		Bucket(int size) {
			noKeys = 0;
			bucketDepth = 0;
			keys = new E*[size];
			visited = false;
		}

		~Bucket() {
			for (int i = 0; i &lt; noKeys; i++) {
				delete keys[i];
			}

			delete[] keys;
		}
	};

	int directoryDepth;
	int bucketSize;
	size_t noKeys;

	Bucket ** directory;

	void init(int directoryDepth, int bucketSize);
	void add_(const E&amp; key);
	void moveKeys(Bucket * oldBucket, Bucket * newBucket);
	void doubleDirectory();
	unsigned long calculatePosition(const E&amp; key, int depth) const;
	E* getKeys() const;
	void mergeSort(E keys[], size_t n, Order order) const;
public:
	class Exception;

	ExtHashing&lt;E&gt; ();
	ExtHashing&lt;E&gt; (int depth, int bucketsize);
	virtual ~ExtHashing&lt;E&gt; ();

	using Container&lt;E&gt;::add;
	virtual void add(const E keys[], size_t size);

	using Container&lt;E&gt;::remove;
	virtual void remove(const E keys[], size_t size);

	virtual bool member(const E&amp; key) const;
	virtual size_t size() const;
	virtual bool empty() const;

	virtual size_t apply(const Functor&lt;E&gt;&amp; f, Order order = dontcare) const;

	virtual E min() const;
	virtual E max() const;

	virtual std::ostream&amp; print(std::ostream &amp;o) const;
};

template&lt;typename E&gt;
ExtHashing&lt;E&gt;::ExtHashing() {
	init(1, 4);
}

template&lt;typename E&gt;
ExtHashing&lt;E&gt;::ExtHashing(int depth, int bucketSize) {
	init(depth, bucketSize);
}

template&lt;typename E&gt;
ExtHashing&lt;E&gt;::~ExtHashing() {
	int size = (int) pow(2, directoryDepth);

	Bucket * tmpBucket;

	// alle buckets löschen
	for (int i = 0; i &lt; size; i++) {
		if (directory[i]) {
			tmpBucket = directory[i];

			for (int j = i; j &lt; size; j++) {
				if (directory[j] == tmpBucket) {
					directory[j] = 0;
				}
			}

			delete tmpBucket;
		}
	}

	// directory löschen
	delete[] directory;
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::init(int depth, int bucketSize) {
	this-&gt;directoryDepth = depth;
	this-&gt;bucketSize = bucketSize;

	int size = (int) pow(2, depth);

	// directory erstellen
	directory = new Bucket*[size];

	// leeren bucket erstellen
	Bucket * newBucket = new Bucket(bucketSize);

	// directory einträge auf leeren bucket zeigen lassen
	for (int i = 0; i &lt; size; i++) {
		directory[i] = newBucket;
	}

	noKeys = 0;
}

template&lt;typename E&gt;
unsigned long ExtHashing&lt;E&gt;::calculatePosition(const E&amp; key, int depth) const {
	// position im directory berechnen (dafür werden depth-anzahl bits verwendet)
	return hashValue(key) % (1 &lt;&lt; depth);
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::moveKeys(Bucket * oldBucket, Bucket * newBucket) {
	int newIndex = 0;
	oldBucket-&gt;bucketDepth++;

	for (int i = 0; i &lt; oldBucket-&gt;noKeys; i++) {

		// ungerade keys in neuen bucket verschieben
		if (hashValue(*oldBucket-&gt;keys[i]) &amp; (1 &lt;&lt; oldBucket-&gt;bucketDepth - 1)) {
			newBucket-&gt;keys[newIndex] = oldBucket-&gt;keys[i];
			oldBucket-&gt;keys[i] = 0;
			newIndex++;
		}
	}

	newBucket-&gt;noKeys = newIndex;
	newBucket-&gt;bucketDepth = oldBucket-&gt;bucketDepth;

	// lücken im alten bucket füllen
	for (int i = 0, flag = 0; i &lt; bucketSize &amp;&amp; flag == 0; i++) {
		if (oldBucket-&gt;keys[i] == 0) {
			int j;

			for (j = i + 1; j &lt; bucketSize; j++) {
				if (oldBucket-&gt;keys[j] != 0) {
					break;
				}
			}

			if (j &lt; bucketSize) {
				oldBucket-&gt;keys[i] = oldBucket-&gt;keys[j];
				oldBucket-&gt;keys[j] = 0;
			} else {
				flag = 1;
			}
		}
	}

	oldBucket-&gt;noKeys -= newIndex;
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::add_(const E&amp; key) {
	Bucket * tmpBucket = directory[calculatePosition(key, directoryDepth)];

	if (tmpBucket-&gt;noKeys &lt; bucketSize) {
		// platz ist frei =&gt; key kann eingefügt werden
		tmpBucket-&gt;keys[tmpBucket-&gt;noKeys] = new E(key);
		tmpBucket-&gt;noKeys++;
	} else {
		if (tmpBucket-&gt;bucketDepth == directoryDepth) {
			// directory muss verdoppelt werden
			doubleDirectory();
		}

		Bucket * newBucket = new Bucket(bucketSize);

		// bucket splitten
		moveKeys(tmpBucket, newBucket);

		// neuen bucket ins directory hängen
		directory[calculatePosition(*newBucket-&gt;keys[0], directoryDepth)]
				= newBucket;

		// ziel bucket für neuen key suchen
		tmpBucket = directory[calculatePosition(key, directoryDepth)];

		// key einfügen
		tmpBucket-&gt;keys[tmpBucket-&gt;noKeys] = new E(key);
		tmpBucket-&gt;noKeys++;
	}
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::doubleDirectory() {
	int size = (int) pow(2, directoryDepth);

	Bucket **tmpDirectory = new Bucket*[size];

	// altes directory kopieren
	for (int i = 0; i &lt; size; i++) {
		tmpDirectory[i] = directory[i];
	}

	// altes directory löscehn
	delete[] directory;

	// neues vergrößertes directory erstellen
	directory = new Bucket*[size * 2];

	// zeiger in neues directory kopieren
	for (int i = 0; i &lt; size; i++) {
		directory[i] = tmpDirectory[i];
		directory[size + i] = tmpDirectory[i];
	}

	// globale tiefer erhöhen
	directoryDepth++;

	// temporäres directory löschen
	delete[] tmpDirectory;
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::add(const E keys[], size_t size) {
	for (size_t i = 0; i &lt; size; i++) {
		if (!member(keys[i])) {
			add_(keys[i]);
			noKeys++;
		}
	}
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::remove(const E keys[], size_t size) {
	int directorySize = (int) pow(2, directoryDepth);

	Bucket *tmpBucket = 0;

	for (size_t i = 0; i &lt; size; i++) {

		if (member(keys[i])) {

			for (int d = 0; d &lt; directorySize; d++) {
				tmpBucket = directory[d];

				for (int j = 0; j &lt; tmpBucket-&gt;noKeys; j++) {
					if (*tmpBucket-&gt;keys[j] == keys[i]) {
						delete tmpBucket-&gt;keys[j];

						// lücken im bucket füllen
						for (int k = j; k &lt; (tmpBucket-&gt;noKeys - 1); k++) {
							tmpBucket-&gt;keys[k] = tmpBucket-&gt;keys[k + 1];
						}

						tmpBucket-&gt;noKeys--;
						noKeys--;
						break;
					}
				}
			}
		}
	}
}

template&lt;typename E&gt;
bool ExtHashing&lt;E&gt;::member(const E&amp; key) const {
	int size = (int) pow(2, directoryDepth);

	Bucket *tmpBucket = 0;

	for (int i = 0; i &lt; size; i++) {
		tmpBucket = directory[i];

		for (int j = 0; j &lt; tmpBucket-&gt;noKeys; j++) {
			if (*tmpBucket-&gt;keys[j] == key) {
				return true;
			}
		}
	}

	return false;
}

template&lt;typename E&gt;
bool ExtHashing&lt;E&gt;::empty() const {
	return noKeys == 0;
}

template&lt;typename E&gt;
size_t ExtHashing&lt;E&gt;::size() const {
	return noKeys;
}

template&lt;typename E&gt;
E ExtHashing&lt;E&gt;::min() const {
	if (size() == 0) {
		throw typename Container&lt;E&gt;::Exception(&quot;ExtHashing::min(): empty&quot;);
	}

	E* keys = getKeys();
	mergeSort(keys, size(), ascending);

	// kleinster key an erster stelle
	E minKey = keys[0];

	delete[] keys;

	return minKey;
}

template&lt;typename E&gt;
E ExtHashing&lt;E&gt;::max() const {
	if (size() == 0) {
		throw typename Container&lt;E&gt;::Exception(&quot;ExtHashing::min(): empty&quot;);
	}

	E* keys = getKeys();
	mergeSort(keys, size(), descending);

	// größter key an erster stelle
	E maxKey = keys[0];

	delete[] keys;

	return maxKey;
}

template&lt;typename E&gt;
std::ostream&amp; ExtHashing&lt;E&gt;::print(std::ostream &amp;o) const {
	int size = (int) pow(2, directoryDepth);

	Bucket *tmpBucket = 0;

	for (int i = 0; i &lt; size; i++) {

		o &lt;&lt; i &lt;&lt; &quot;: &quot;;

		tmpBucket = directory[i];

		for (int j = 0; j &lt; tmpBucket-&gt;noKeys; j++) {
			if (tmpBucket-&gt;keys[j] != 0) {
				o &lt;&lt; *tmpBucket-&gt;keys[j] &lt;&lt; &quot; &quot;;
			}
		}

		o &lt;&lt; std::endl;
	}

	return o;
}

template&lt;typename E&gt;
size_t ExtHashing&lt;E&gt;::apply(const Functor&lt;E&gt;&amp; f, Order order) const {

	size_t cnt = 0;

	E* keys = getKeys();

	if (order != dontcare) {
		// keys sortieren
		mergeSort(keys, size(), order);
	}

	// functor für alle keys aufrufen
	for (size_t i = 0; i &lt; size(); i++) {
		cnt++;

		if (f(keys[i]) == false) {
			break;
		}
	}

	delete[] keys;

	return cnt;
}

/**
 * Alle Keys als Array holen
 */
template&lt;typename E&gt;
E* ExtHashing&lt;E&gt;::getKeys() const {
	E* keys = new E[size()];

	int size = (int) pow(2, directoryDepth);
	size_t cnt = 0;
	Bucket * tmpBucket;

	for (int i = 0; i &lt; size; i++) {
		directory[i]-&gt;visited = false;
	}

	for (int i = 0; i &lt; size; i++) {
		tmpBucket = directory[i];

		// jeder bucket darf nur einmal durchlaufen werden
		if (tmpBucket-&gt;visited == false) {

			for (int j = 0; j &lt; tmpBucket-&gt;noKeys; j++) {
				if (tmpBucket-&gt;visited == false) {
					keys[cnt] = *tmpBucket-&gt;keys[j];
					cnt++;
				}
			}

			tmpBucket-&gt;visited = true;
		}
	}

	return keys;
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::mergeSort(E keys[], size_t n, Order order) const {
	size_t i, j, k;

	if (n &lt; 2) {
		return;
	}

	// elemente in erste hälfte
	size_t f = n / 2;

	// beide hälfte rekursiv sortieren
	mergeSort(keys, f, order);
	mergeSort(keys + f, n - f, order);

	// mergen

	// temp array für sortierte keys
	E *s = new E[n];

	for (i = 0, j = f, k = 0; i &lt; f &amp;&amp; j &lt; n;) {
		s[k++] = (((order == ascending) &amp;&amp; !(keys[i] &gt; keys[j])) || ((order
				== descending) &amp;&amp; (keys[i] &gt; keys[j]))) ? keys[i++] : keys[j++];
	}

	while (i &lt; f) {
		s[k++] = keys[i++];
	}

	while (j &lt; n) {
		s[k++] = keys[j++];
	}

	for (i = 0; i &lt; n; i++) {
		keys[i] = s[i];
	}

	delete[] s;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/243293/bus-error</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 03:41:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243293.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Jun 2009 09:36:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bus Error on Mon, 15 Jun 2009 09:36:06 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>ich muss ein programm online abgeben. lokal funktioniert alles jedoch wenn ich es online abgebe und der ein unit test durchgeführt wird kommt der fehler bus error. und ich kann diesen fehler nicht finden. bitte um hilfe.</p>
<pre><code class="language-cpp">#ifndef EXTHASHING_H
#define EXTHASHING_H

#include &lt;iostream&gt;
#include &lt;cmath&gt;
#include &quot;Container.h&quot;

template&lt;typename E&gt;
class ExtHashing: public Container&lt;E&gt; {

	class Bucket {
	public:
		int noKeys;
		int bucketDepth;
		E** keys;
		bool visited;

		Bucket(int size) {
			noKeys = 0;
			bucketDepth = 0;
			keys = new E*[size];
			visited = false;
		}

		~Bucket() {
			for (int i = 0; i &lt; noKeys; i++) {
				delete keys[i];
			}

			delete[] keys;
		}
	};

	int directoryDepth;
	int bucketSize;
	size_t noKeys;

	Bucket ** directory;

	void init(int directoryDepth, int bucketSize);
	void add_(const E&amp; key);
	void moveKeys(Bucket * oldBucket, Bucket * newBucket);
	void doubleDirectory();
	unsigned long calculatePosition(const E&amp; key, int depth) const;
	E* getKeys() const;
	void mergeSort(E keys[], size_t n, Order order) const;
public:
	class Exception;

	ExtHashing&lt;E&gt; ();
	ExtHashing&lt;E&gt; (int depth, int bucketsize);
	virtual ~ExtHashing&lt;E&gt; ();

	using Container&lt;E&gt;::add;
	virtual void add(const E keys[], size_t size);

	using Container&lt;E&gt;::remove;
	virtual void remove(const E keys[], size_t size);

	virtual bool member(const E&amp; key) const;
	virtual size_t size() const;
	virtual bool empty() const;

	virtual size_t apply(const Functor&lt;E&gt;&amp; f, Order order = dontcare) const;

	virtual E min() const;
	virtual E max() const;

	virtual std::ostream&amp; print(std::ostream &amp;o) const;
};

template&lt;typename E&gt;
ExtHashing&lt;E&gt;::ExtHashing() {
	init(1, 4);
}

template&lt;typename E&gt;
ExtHashing&lt;E&gt;::ExtHashing(int depth, int bucketSize) {
	init(depth, bucketSize);
}

template&lt;typename E&gt;
ExtHashing&lt;E&gt;::~ExtHashing() {
	int size = (int) pow(2, directoryDepth);

	Bucket * tmpBucket;

	// alle buckets löschen
	for (int i = 0; i &lt; size; i++) {
		if (directory[i]) {
			tmpBucket = directory[i];

			for (int j = i; j &lt; size; j++) {
				if (directory[j] == tmpBucket) {
					directory[j] = 0;
				}
			}

			delete tmpBucket;
		}
	}

	// directory löschen
	delete[] directory;
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::init(int depth, int bucketSize) {
	this-&gt;directoryDepth = depth;
	this-&gt;bucketSize = bucketSize;

	int size = (int) pow(2, depth);

	// directory erstellen
	directory = new Bucket*[size];

	// leeren bucket erstellen
	Bucket * newBucket = new Bucket(bucketSize);

	// directory einträge auf leeren bucket zeigen lassen
	for (int i = 0; i &lt; size; i++) {
		directory[i] = newBucket;
	}

	noKeys = 0;
}

template&lt;typename E&gt;
unsigned long ExtHashing&lt;E&gt;::calculatePosition(const E&amp; key, int depth) const {
	// position im directory berechnen (dafür werden depth-anzahl bits verwendet)
	return hashValue(key) % (1 &lt;&lt; depth);
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::moveKeys(Bucket * oldBucket, Bucket * newBucket) {
	int newIndex = 0;
	oldBucket-&gt;bucketDepth++;

	for (int i = 0; i &lt; oldBucket-&gt;noKeys; i++) {

		// ungerade keys in neuen bucket verschieben
		if (hashValue(*oldBucket-&gt;keys[i]) &amp; (1 &lt;&lt; oldBucket-&gt;bucketDepth - 1)) {
			newBucket-&gt;keys[newIndex] = oldBucket-&gt;keys[i];
			oldBucket-&gt;keys[i] = 0;
			newIndex++;
		}
	}

	newBucket-&gt;noKeys = newIndex;
	newBucket-&gt;bucketDepth = oldBucket-&gt;bucketDepth;

	// lücken im alten bucket füllen
	for (int i = 0, flag = 0; i &lt; bucketSize &amp;&amp; flag == 0; i++) {
		if (oldBucket-&gt;keys[i] == 0) {
			int j;

			for (j = i + 1; j &lt; bucketSize; j++) {
				if (oldBucket-&gt;keys[j] != 0) {
					break;
				}
			}

			if (j &lt; bucketSize) {
				oldBucket-&gt;keys[i] = oldBucket-&gt;keys[j];
				oldBucket-&gt;keys[j] = 0;
			} else {
				flag = 1;
			}
		}
	}

	oldBucket-&gt;noKeys -= newIndex;
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::add_(const E&amp; key) {
	Bucket * tmpBucket = directory[calculatePosition(key, directoryDepth)];

	if (tmpBucket-&gt;noKeys &lt; bucketSize) {
		// platz ist frei =&gt; key kann eingefügt werden
		tmpBucket-&gt;keys[tmpBucket-&gt;noKeys] = new E(key);
		tmpBucket-&gt;noKeys++;
	} else {
		if (tmpBucket-&gt;bucketDepth == directoryDepth) {
			// directory muss verdoppelt werden
			doubleDirectory();
		}

		Bucket * newBucket = new Bucket(bucketSize);

		// bucket splitten
		moveKeys(tmpBucket, newBucket);

		// neuen bucket ins directory hängen
		directory[calculatePosition(*newBucket-&gt;keys[0], directoryDepth)]
				= newBucket;

		// ziel bucket für neuen key suchen
		tmpBucket = directory[calculatePosition(key, directoryDepth)];

		// key einfügen
		tmpBucket-&gt;keys[tmpBucket-&gt;noKeys] = new E(key);
		tmpBucket-&gt;noKeys++;
	}
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::doubleDirectory() {
	int size = (int) pow(2, directoryDepth);

	Bucket **tmpDirectory = new Bucket*[size];

	// altes directory kopieren
	for (int i = 0; i &lt; size; i++) {
		tmpDirectory[i] = directory[i];
	}

	// altes directory löscehn
	delete[] directory;

	// neues vergrößertes directory erstellen
	directory = new Bucket*[size * 2];

	// zeiger in neues directory kopieren
	for (int i = 0; i &lt; size; i++) {
		directory[i] = tmpDirectory[i];
		directory[size + i] = tmpDirectory[i];
	}

	// globale tiefer erhöhen
	directoryDepth++;

	// temporäres directory löschen
	delete[] tmpDirectory;
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::add(const E keys[], size_t size) {
	for (size_t i = 0; i &lt; size; i++) {
		if (!member(keys[i])) {
			add_(keys[i]);
			noKeys++;
		}
	}
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::remove(const E keys[], size_t size) {
	int directorySize = (int) pow(2, directoryDepth);

	Bucket *tmpBucket = 0;

	for (size_t i = 0; i &lt; size; i++) {

		if (member(keys[i])) {

			for (int d = 0; d &lt; directorySize; d++) {
				tmpBucket = directory[d];

				for (int j = 0; j &lt; tmpBucket-&gt;noKeys; j++) {
					if (*tmpBucket-&gt;keys[j] == keys[i]) {
						delete tmpBucket-&gt;keys[j];

						// lücken im bucket füllen
						for (int k = j; k &lt; (tmpBucket-&gt;noKeys - 1); k++) {
							tmpBucket-&gt;keys[k] = tmpBucket-&gt;keys[k + 1];
						}

						tmpBucket-&gt;noKeys--;
						noKeys--;
						break;
					}
				}
			}
		}
	}
}

template&lt;typename E&gt;
bool ExtHashing&lt;E&gt;::member(const E&amp; key) const {
	int size = (int) pow(2, directoryDepth);

	Bucket *tmpBucket = 0;

	for (int i = 0; i &lt; size; i++) {
		tmpBucket = directory[i];

		for (int j = 0; j &lt; tmpBucket-&gt;noKeys; j++) {
			if (*tmpBucket-&gt;keys[j] == key) {
				return true;
			}
		}
	}

	return false;
}

template&lt;typename E&gt;
bool ExtHashing&lt;E&gt;::empty() const {
	return noKeys == 0;
}

template&lt;typename E&gt;
size_t ExtHashing&lt;E&gt;::size() const {
	return noKeys;
}

template&lt;typename E&gt;
E ExtHashing&lt;E&gt;::min() const {
	if (size() == 0) {
		throw typename Container&lt;E&gt;::Exception(&quot;ExtHashing::min(): empty&quot;);
	}

	E* keys = getKeys();
	mergeSort(keys, size(), ascending);

	// kleinster key an erster stelle
	E minKey = keys[0];

	delete[] keys;

	return minKey;
}

template&lt;typename E&gt;
E ExtHashing&lt;E&gt;::max() const {
	if (size() == 0) {
		throw typename Container&lt;E&gt;::Exception(&quot;ExtHashing::min(): empty&quot;);
	}

	E* keys = getKeys();
	mergeSort(keys, size(), descending);

	// größter key an erster stelle
	E maxKey = keys[0];

	delete[] keys;

	return maxKey;
}

template&lt;typename E&gt;
std::ostream&amp; ExtHashing&lt;E&gt;::print(std::ostream &amp;o) const {
	int size = (int) pow(2, directoryDepth);

	Bucket *tmpBucket = 0;

	for (int i = 0; i &lt; size; i++) {

		o &lt;&lt; i &lt;&lt; &quot;: &quot;;

		tmpBucket = directory[i];

		for (int j = 0; j &lt; tmpBucket-&gt;noKeys; j++) {
			if (tmpBucket-&gt;keys[j] != 0) {
				o &lt;&lt; *tmpBucket-&gt;keys[j] &lt;&lt; &quot; &quot;;
			}
		}

		o &lt;&lt; std::endl;
	}

	return o;
}

template&lt;typename E&gt;
size_t ExtHashing&lt;E&gt;::apply(const Functor&lt;E&gt;&amp; f, Order order) const {

	size_t cnt = 0;

	E* keys = getKeys();

	if (order != dontcare) {
		// keys sortieren
		mergeSort(keys, size(), order);
	}

	// functor für alle keys aufrufen
	for (size_t i = 0; i &lt; size(); i++) {
		cnt++;

		if (f(keys[i]) == false) {
			break;
		}
	}

	delete[] keys;

	return cnt;
}

/**
 * Alle Keys als Array holen
 */
template&lt;typename E&gt;
E* ExtHashing&lt;E&gt;::getKeys() const {
	E* keys = new E[size()];

	int size = (int) pow(2, directoryDepth);
	size_t cnt = 0;
	Bucket * tmpBucket;

	for (int i = 0; i &lt; size; i++) {
		directory[i]-&gt;visited = false;
	}

	for (int i = 0; i &lt; size; i++) {
		tmpBucket = directory[i];

		// jeder bucket darf nur einmal durchlaufen werden
		if (tmpBucket-&gt;visited == false) {

			for (int j = 0; j &lt; tmpBucket-&gt;noKeys; j++) {
				if (tmpBucket-&gt;visited == false) {
					keys[cnt] = *tmpBucket-&gt;keys[j];
					cnt++;
				}
			}

			tmpBucket-&gt;visited = true;
		}
	}

	return keys;
}

template&lt;typename E&gt;
void ExtHashing&lt;E&gt;::mergeSort(E keys[], size_t n, Order order) const {
	size_t i, j, k;

	if (n &lt; 2) {
		return;
	}

	// elemente in erste hälfte
	size_t f = n / 2;

	// beide hälfte rekursiv sortieren
	mergeSort(keys, f, order);
	mergeSort(keys + f, n - f, order);

	// mergen

	// temp array für sortierte keys
	E *s = new E[n];

	for (i = 0, j = f, k = 0; i &lt; f &amp;&amp; j &lt; n;) {
		s[k++] = (((order == ascending) &amp;&amp; !(keys[i] &gt; keys[j])) || ((order
				== descending) &amp;&amp; (keys[i] &gt; keys[j]))) ? keys[i++] : keys[j++];
	}

	while (i &lt; f) {
		s[k++] = keys[i++];
	}

	while (j &lt; n) {
		s[k++] = keys[j++];
	}

	for (i = 0; i &lt; n; i++) {
		keys[i] = s[i];
	}

	delete[] s;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1726813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726813</guid><dc:creator><![CDATA[deiwid]]></dc:creator><pubDate>Mon, 15 Jun 2009 09:36:06 GMT</pubDate></item><item><title><![CDATA[Reply to Bus Error on Mon, 15 Jun 2009 09:38:17 GMT]]></title><description><![CDATA[<p>Vielleicht liegt es nicht an dir ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726815</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 15 Jun 2009 09:38:17 GMT</pubDate></item><item><title><![CDATA[Reply to Bus Error on Mon, 15 Jun 2009 09:51:07 GMT]]></title><description><![CDATA[<p>1. Was heisst &quot;online abgeben&quot;? Ich verstehe darunter irgendwie nichts, was einen Unit-Test auslöst und dann einen Bus Error. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
2. Du erwartest nicht wirklich, dass wir deinen ganzen Quellcode durchgehen und einen Fehler suchen, den du nicht mal richtig beschreibst? Und das alles ohne Bezahlung? Ja wo sind wir hier denn? lol</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726828</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 15 Jun 2009 09:51:07 GMT</pubDate></item><item><title><![CDATA[Reply to Bus Error on Mon, 15 Jun 2009 11:09:19 GMT]]></title><description><![CDATA[<p>Ich schließe mich meinen Vorrednern an, dass sich das niemand durchlesen wird. Aber zumindest den Begriff &quot;bus error&quot; kann ich erklären: Es wird auf eine nicht existierende Speicheraddresse zugegriffen. Das hat im Prinzip die gleiche Ursache wie ein segmentation fault: Es wird ein falsch gesetzter (oder ungesetzter) Pointer dereferenziert. Nur dass dieser beim segmentation fault auf eine existierende aber verbotene Adresse verweist, beim bus error aber zufällig auf eine nicht existierende.</p>
<p>Zur Ursachenforschung: Verwende ein Speicheranalysewerkzeug (z.B. valgrind) oder einen Debugger und suche damit den Ort des Fehlers. Wenn du den Ort des Fehlers hast und immer noch nicht weiterweißt, dann kann man dir hier weiterhelfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726871</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 15 Jun 2009 11:09:19 GMT</pubDate></item></channel></rss>