<?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[Programm läuft einfach nicht weiter?]]></title><description><![CDATA[<p>Hallo,</p>
<p>mit der SuFu hab ich nichts gefunden, daher habe ich beschlossen, mich nach ewig langer Zeit mal wieder einzuloggen und ein Thema zu eröffnen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich habe folgendes Problem: Mein Programm wird einfach nicht weiter ausgeführt.</p>
<p>Um mal ein wenig konkreter zu werden: Ich schreibe ein C++ - Plugin für eine Visualisierungssoftware, bei dem ich Datensätze segmentiere. Seltsam ist: Wenn ich das für kleine Datensätze &lt; 6 Mio Einträge mache, läuft alles. Bei Datensätzen, die mehr Daten haben (der aktuelle Testcase hat ~13 Mio.), hört das Programm mitten drin einfach auf zu arbeiten (oder ich sehe es nicht).</p>
<p>Ich habe zum Beispiel 2 Haltepunkte - von einem Haltepunkt zum nächsten kommt dann einfach keine Rückmeldung mehr. Wie kann sowas kommen?</p>
<p>Ich nutze grad folgendes System:<br />
Win7 64bit / Core i7 @ 2,13GhZ / 16GB RAM, Entwicklungsumgebung ist Visual Studio</p>
<p>Hat schon jemand von euch eine grobe Idee, oder soll ich anfangen, Code zu posten? Ich sehe nur grad erstmal davon ab, da das vielleicht etwas ausufernd wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Bin für jede Hilfe dankbar, Gruß,<br />
Freddixx</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286211/programm-läuft-einfach-nicht-weiter</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 20:42:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286211.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 May 2011 16:57:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 05 May 2011 16:57:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mit der SuFu hab ich nichts gefunden, daher habe ich beschlossen, mich nach ewig langer Zeit mal wieder einzuloggen und ein Thema zu eröffnen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich habe folgendes Problem: Mein Programm wird einfach nicht weiter ausgeführt.</p>
<p>Um mal ein wenig konkreter zu werden: Ich schreibe ein C++ - Plugin für eine Visualisierungssoftware, bei dem ich Datensätze segmentiere. Seltsam ist: Wenn ich das für kleine Datensätze &lt; 6 Mio Einträge mache, läuft alles. Bei Datensätzen, die mehr Daten haben (der aktuelle Testcase hat ~13 Mio.), hört das Programm mitten drin einfach auf zu arbeiten (oder ich sehe es nicht).</p>
<p>Ich habe zum Beispiel 2 Haltepunkte - von einem Haltepunkt zum nächsten kommt dann einfach keine Rückmeldung mehr. Wie kann sowas kommen?</p>
<p>Ich nutze grad folgendes System:<br />
Win7 64bit / Core i7 @ 2,13GhZ / 16GB RAM, Entwicklungsumgebung ist Visual Studio</p>
<p>Hat schon jemand von euch eine grobe Idee, oder soll ich anfangen, Code zu posten? Ich sehe nur grad erstmal davon ab, da das vielleicht etwas ausufernd wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Bin für jede Hilfe dankbar, Gruß,<br />
Freddixx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059130</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Thu, 05 May 2011 16:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 05 May 2011 17:09:34 GMT]]></title><description><![CDATA[<p>Ohne Code ist das zu vage. Das einzige was man vermuten könnte ist ein Überlauf irgendeiner Art, aber es könnte auch leicht irgendein anderer Fehler sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059136</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 05 May 2011 17:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 05 May 2011 20:50:23 GMT]]></title><description><![CDATA[<p>Lies dir bitte zuerst den in diesem Forum oben stehenden Beitrag <em>&quot;Du brauchst Hilfe?&quot;</em> durch (ALLES aber vor allem den Abschnitt <strong>Stell deine Fragen präzise.</strong>), bevor du nach Hilfe fragst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059244</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Thu, 05 May 2011 20:50:23 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Fri, 06 May 2011 11:36:33 GMT]]></title><description><![CDATA[<p>[Rewind] schrieb:</p>
<blockquote>
<p>Lies dir bitte zuerst den in diesem Forum oben stehenden Beitrag <em>&quot;Du brauchst Hilfe?&quot;</em> durch (ALLES aber vor allem den Abschnitt <strong>Stell deine Fragen präzise.</strong>), bevor du nach Hilfe fragst.</p>
</blockquote>
<p>Ob du's glaubst oder nicht: Den Thread habe ich auch gelesen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Das Projekt ist mittlerweile recht komplex geworden. Daher wollte ich es <strong>erstmal</strong> mit einer Grobeinschätzung versuchen.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Ohne Code ist das zu vage. Das einzige was man vermuten könnte ist ein Überlauf irgendeiner Art, aber es könnte auch leicht irgendein anderer Fehler sein.</p>
</blockquote>
<p>Alles klar, ich poste hier mal ein paar Ausschnitte. Vielleicht stelle ich mich auch nur zu blöd an. Ich programmiere erst seit 8 Wochen C++ und entlehne mein Wissen vornehmlich Büchern und Beispielen der C++-Referenz. Ursprünglich programmiere ich eher Java <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
<p>Erstmal der Code, bei dem es kracht:</p>
<pre><code class="language-cpp">list&lt;Area&gt; VoxelGraph::initSearch() {
	list&lt;Area&gt; areas;
	while (this-&gt;hasNext()) {
		Voxel* currentVoxel = this-&gt;getNext();		
		Area a;
 		a.addVoxel(currentVoxel);
		//If there are valid neighbours, enqueue them
		this-&gt;enqueueNeighbours(currentVoxel, &amp;a);
		vgraph[currentVoxel-&gt;getX()][currentVoxel-&gt;getY()][currentVoxel-&gt;getZ()] = 0;
		while (!this-&gt;queue.empty()) {
			Voxel* v = this-&gt;queuePop();
			this-&gt;enqueueNeighbours(v, &amp;a);
			a.addVoxel(v);
			vgraph[v-&gt;getX()][v-&gt;getY()][v-&gt;getZ()] = 0;
		}
		areas.push_back(a);
	} // DIES ist die Stelle, an der er bei großen Datensätzen rausspringt,
	  // er bearbeitet die While-Schleife einfach nicht mehr weiter. Er prüft
	  // nicht einmal die Bedingung im Kopf.
	return areas;
}
</code></pre>
<p>Dann noch die essentiellen Entities:</p>
<pre><code class="language-cpp">class Voxel {

public:
	Voxel(int x1, int y1, int z1, short grey1);
	Voxel();
	~Voxel(void);
	int		getX() { return x; };
	void	setX(int x1);
	int		getY() { return y; };
	void	setY(int y1);
	int		getZ() { return z; };
	void	setZ(int z1);
	short	getGrey() { return grey; };
	void	setGrey(short grey1);
	bool	getEnqueued() { return enqueued; };
	void	setEnqueued(bool e) { enqueued = e; };
private:
	int		x;
	int		y;
	int		z;
	short	grey;
	bool	enqueued;
	bool    isEdge;

};
</code></pre>
<pre><code class="language-cpp">class Area {

public:
	Area(void);
	Area(short avgGrey);
	~Area(void);
	void addVoxel(Voxel* v);
	short getAvgGrey() { return avgGrey; }
	list&lt;Voxel*&gt; voxels;
	list&lt;Voxel&gt; voxels2;

private:
	short avgGrey;
	long  totalGrey;
};
</code></pre>
<p>Hinter dem vgraph verbirgt sich (derzeit) nur dieses Konstrukt:</p>
<pre><code class="language-cpp">typedef vector&lt;Voxel*&gt; voxVec1D;
typedef vector&lt;voxVec1D&gt; voxVec2D;
typedef vector&lt;voxVec2D&gt; voxVec3D;
</code></pre>
<p>Noch eine Frage: Es kam die Vermutung, dass es sich um einen Variablenüberlauf handeln könnte. Kommt da nicht immer irgendein Runtime-Fehler? Kann er im Debugmode auch stillschweigend hängen? Wenn ja, dann prüfe ich erstmal alle Variablen noch einmal zusätzlich durch, während ich auf eure Antworten warte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059456</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Fri, 06 May 2011 11:36:33 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Fri, 06 May 2011 15:06:25 GMT]]></title><description><![CDATA[<p>Ich hoffe doch, daß du deinem vgraph vor dieser Funktion genug Elemente spendiert hast, daß die Zugriffe nicht über die vector-Größen hinausschreiben.</p>
<p>freddixx schrieb:</p>
<blockquote>
<p>Noch eine Frage: Es kam die Vermutung, dass es sich um einen Variablenüberlauf handeln könnte. Kommt da nicht immer irgendein Runtime-Fehler? Kann er im Debugmode auch stillschweigend hängen? Wenn ja, dann prüfe ich erstmal alle Variablen noch einmal zusätzlich durch, während ich auf eure Antworten warte.</p>
</blockquote>
<p>Wenn du Pech hast, bewirkt so ein Überlauf auch eine Endlosschleife, weil der maximal mögliche Wert der Zählvariable kleiner ist als das Ziel und sie plötzlich wieder bei Null anfängt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059574</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 06 May 2011 15:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Fri, 06 May 2011 15:21:11 GMT]]></title><description><![CDATA[<p>Hm, genug Elemente hat er. Da er praktisch das Koordinatensystem repräsentiert, wird da nichts überschritten.</p>
<p>Das mit der Zählschleife klingt sinnvoll. Vielleicht wird unsigned int ja irgendwo geknackt. Was mich nur verwirrt - das könnte maximal in den hasNext()-Funktionen passieren - und die werden ja nach der als Kommentar markierten Stelle lt. Debugger nicht noch einmal aufgerufen.</p>
<p>Bietet es sich an, &quot;a&quot; manuell zu zerstören, nachdem es in &quot;areas&quot; eingehängt wurde? Eigentlich nicht, oder? Da die Variable zum erneuten Schleifendurchlauf ja neu initialisiert wird. Ich denke bloß, dass ihn das vielleicht Zeit kosten könnte, bis er alle 13 Mio. Voxel in diesem Areal gelöscht und den Speicher wieder freigegeben hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059583</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Fri, 06 May 2011 15:21:11 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Fri, 06 May 2011 17:01:24 GMT]]></title><description><![CDATA[<p>Setz an den Schleifenbeginn mal einen Breakpoint. Da du sagst, dass er die Probleme bei großen Datensätzen hat, könntest du dem breakpoint einen hitcount spendieren und nur alle ~100 Durchläufe stoppen. So kannst du nach und nach abgrenzen, wieviele Durchläufe er baucht, bis er steht. Wenn das ne konstante Zahl ist, kannst du die fragliche Schleife dann schrittweise debuggen um rauszufinden wann und wo das genau passiert..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059646</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 06 May 2011 17:01:24 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Mon, 09 May 2011 08:45:38 GMT]]></title><description><![CDATA[<p>Also die genaue Zahl kenn ich ja. Da der Algorithmus beim Referenzdatensatz deterministisch ist, ist der Aussprungpunkt immer derselbe. Ich werde jetzt gleich (sobald mein Rechner wieder hier ist) mal einen Langzeitdebug machen.</p>
<p>Ich habe nämlich auch noch den Verdacht, dass sich der Rechner einfach tot macht, wenn er versucht, ein Element in eine Liste einzuhängen, das 13,6 Mio. Komponenten unter sich trägt.</p>
<p>Da müsste ich doch deutlich schneller sein, wenn ich nur eine</p>
<pre><code class="language-cpp">list&lt;Area*&gt;
</code></pre>
<p>anstelle einer</p>
<pre><code class="language-cpp">list&lt;Area&gt;
</code></pre>
<p>verwalte, weil er ja dann nur die Speicheradresse anstatt des ganzen Elements hängen muss, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060738</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Mon, 09 May 2011 08:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Mon, 09 May 2011 17:12:39 GMT]]></title><description><![CDATA[<p>Soo, ich hab heut Nachmittag mal gut 2h den Debugger laufen lassen. In der Tat war es wirklich so, dass er irgendwann mal fertig wurde.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
<p>Nun hab ich <code>list&lt;Area&gt;</code> in <code>list&lt;Area*&gt;</code> umgewandelt, was - wie ich mir bereits dachte - einen erheblichen Performanceschub brachte. Allerdings muss ich jetzt dauernd selbst aufräumen, da ich ja stets mit</p>
<pre><code class="language-cpp">Area* a = new Area();
</code></pre>
<p>neue Subsets erzeuge. Ich habe schon ein wenig gegoogelt, aber ein paar offene Punkte wären da noch (für mich als Java-GC-Verwöhnter :)):</p>
<ul>
<li>wenn ich eine <code>Area* a</code> löschen will, dann rufe ich einfach</li>
</ul>
<pre><code class="language-cpp">delete a;
</code></pre>
<p>auf?</p>
<ul>
<li>wenn der Destruktor aufgerufen wird, muss dieser dann selbst noch etwas beinhalten? Muss ich in der Area zum Beispiel</li>
</ul>
<pre><code class="language-cpp">delete voxels;
delete voxels2;
</code></pre>
<p>aufrufen? So wie ich das mitbekommen habe, müsste ja sonst nichts weiter hin, da er das ja für simple Datentypen selbstständig macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060948</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Mon, 09 May 2011 17:12:39 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Mon, 09 May 2011 17:23:10 GMT]]></title><description><![CDATA[<p>freddixx schrieb:</p>
<blockquote>
<p>Ich habe schon ein wenig gegoogelt, aber ein paar offene Punkte wären da noch (für mich als Java-GC-Verwöhnter :)):</p>
</blockquote>
<p>Als Java-GC verwöhnter solltest du dir schnellstens alles abgewöhnen, was du aus Java kennst. new und delete brauchst du in C++ so gut wie nie. Da arbeitet man normalerweise mit den Gültigkeitsbereichen um die Lebenszeit von Variablen zu steuern. Für den außergewöhnlichen Fall, dass man doch mal die Lebenszeit eines Objektes über den aktuellen Gültigkeitsbereich verlängern muss, schaut man ob die Standardbibliothek nichts dafür anbietet (es gibt da sehr viele Probleme die schon gelöst sind) und findet vermutlich einen der Smartpointer. Und falls selbst dieser nicht das sein sollte was man sucht, dann macht man die Mechanismen aus der Standardbibliothek zum sauberen und automatischen Löschen nach. Stichwort dazu: <em>RAII</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060956</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 09 May 2011 17:23:10 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Mon, 09 May 2011 17:36:22 GMT]]></title><description><![CDATA[<p>Hm, also muss ich <code>new</code> nicht verwenden, wenn ich Speicherplatz für einen neuen Objektinstanzzeiger möchte?</p>
<p>Ich meine, dass das hier geht, ist mir klar:</p>
<pre><code class="language-cpp">Area a = Area(5);
</code></pre>
<p>Aber ich dachte, wenn ich einen Zeiger will, brauche ich new, à la:</p>
<pre><code class="language-cpp">Area* a = new Area(5);
</code></pre>
<p>, da ich mir ja Speicherplatz für diesen Zeiger holen muss. Oder soll ich es aufwändiger machen und so umschreiben:</p>
<pre><code class="language-cpp">Area a = Area(5);
Area* aPtr = &amp;a;
</code></pre>
<p>Ich geb mir ja echt schon Mühe, ordentlich umzudenken. Aber natürlich vergleicht man im Kopf immer alles mit Java und wendet bekannte Muster an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Dein Stichwort hab ich grad gegoogelt und ziehe mir den englischen Wikipedia-Artikel rein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060960</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Mon, 09 May 2011 17:36:22 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Mon, 09 May 2011 17:42:23 GMT]]></title><description><![CDATA[<p>Für so große Datenmengen könnte man auch den Container std::deque verwenden, je nachdem welche Operationen du auf dem Container wie oft nutzt. Manuelle Speicherverwaltung solltest du wirklich meiden (siehe SeppJ).</p>
<p>Und welchen Compiler nutzt du? Beim neuen Visual Studio 2010 ist in den Komponenten der Standardbibliothek afaik schon moving implementiert, da geht das Umkopieren um Welten schneller. In einer <code>list&lt;Area&gt;</code> muss er z.B. bei jedem <code>push_back</code> das komplette Objekt umkopieren, inklusive der zwei darin enthaltenen Listen. Das R-Value- und std::move-Konzept erspart das Kopieren praktisch, kommt aber erst mit dem C++0x-Standard, der aber in den neueren Compilern schon teilweise implementiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060962</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Mon, 09 May 2011 17:42:23 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Mon, 09 May 2011 17:43:46 GMT]]></title><description><![CDATA[<p>Du verstehst nicht: Die Frage die du dir stellen solltest ist, ob du überhaupt einen Zeiger braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060963</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 09 May 2011 17:43:46 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Mon, 09 May 2011 17:50:23 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du verstehst nicht: Die Frage die du dir stellen solltest ist, ob du überhaupt einen Zeiger braucht.</p>
</blockquote>
<p>Konzeptionell nicht, aber wenn es einen wichtigen Geschwindigkeitsschub bringt, überwiegt das natürlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060966</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Mon, 09 May 2011 17:50:23 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Mon, 09 May 2011 17:50:44 GMT]]></title><description><![CDATA[<p>fdfdg schrieb:</p>
<blockquote>
<p>Für so große Datenmengen könnte man auch den Container std::deque verwenden, je nachdem welche Operationen du auf dem Container wie oft nutzt. Manuelle Speicherverwaltung solltest du wirklich meiden (siehe SeppJ).</p>
<p>Und welchen Compiler nutzt du? Beim neuen Visual Studio 2010 ist in den Komponenten der Standardbibliothek afaik schon moving implementiert, da geht das Umkopieren um Welten schneller. In einer <code>list&lt;Area&gt;</code> muss er z.B. bei jedem <code>push_back</code> das komplette Objekt umkopieren, inklusive der zwei darin enthaltenen Listen. Das R-Value- und std::move-Konzept erspart das Kopieren praktisch, kommt aber erst mit dem C++0x-Standard, der aber in den neueren Compilern schon teilweise implementiert ist.</p>
</blockquote>
<p>Ich benutze derzeit VisualStudio 2005 - ich habe auch 2010 hier, muss aber projektgebunden 2005 verwenden.</p>
<p>Ich hab mird die anderen Typen mal angesehen. Ich denke, ich bin mit einer Liste gut dabei, da ich ja nie irgendwo innen zugreifen muss. Allerdings weiß ich nicht, wie viel schneller eine deque ist - meinst du, das bringt was? Dann würde ich das mal ausprobieren.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Du verstehst nicht: Die Frage die du dir stellen solltest ist, ob du überhaupt einen Zeiger braucht.</p>
</blockquote>
<p>Es kann gut sein, dass ich es nicht verstehe. Ich versuche mal zu erklären, wie ich das sehe, dann kommen wir vielleicht auf einen Nenner: Ich habe eine Area mit ~14Mio Elementen. Und eben diese Area an das Ende einer list anzuhängen dauert ewig (er erstellt doch ne Kopie und schmeißt die rauf, oder?). Klar ist es in meinen Augen performanter, mir einfach nur den Pointer zu holen und den raufzuschmeißen (der ist ja auch viel kleiner..).</p>
<p>Ich habe mir bereits das Referenzwerk von Stroustrup bestellt, das morgen hoffentlich in meinem Briefkasten liegt. Nichtsdestotrotz bin ich euch für eure Erklärungen sehr dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060967</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Mon, 09 May 2011 17:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Tue, 10 May 2011 09:58:26 GMT]]></title><description><![CDATA[<p>Okay, habe mich über RAII belesen - erscheint mir auch sinnvoll. In Zukunft sollte ich also das Speicherbereitstellen über <code>new</code> unterlassen.</p>
<p>Wie kann ich dennoch das Kopieren großer Objekte vermeiden? Soll ich immer erst das Objekt erstellen und mir dann mit <code>&amp;</code> den Pointer holen? Oder ließe sich (besonders in diesem Szenrario) vollständig auf Pointer verzichten, ohne allzu krasse Geschwindigkeitseinbußen zu verzeichnen?</p>
<p>Und verstehe ich jetzt richtig: Wenn ich new nicht verwende, wird der Destruktor auch automatisch aufgerufen, wenn der Scope der Variable verlassen wird. Ich muss also nur dafür sorgen, dass der Destruktor ordentlich ist (Dateien schließen, usw)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061177</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Tue, 10 May 2011 09:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Wed, 11 May 2011 16:09:33 GMT]]></title><description><![CDATA[<p>Habt ihr die Fragen überlesen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
<p>Wäre nett, wenn ihr die Fragen aus den voran gegangenen Posts noch beantworten könnt (leider auch, weil mein Stroustrup immer noch nicht da ist und ich gern Köpfe mit Nägeln machen möchte..).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061862</guid><dc:creator><![CDATA[freddixx]]></dc:creator><pubDate>Wed, 11 May 2011 16:09:33 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Wed, 11 May 2011 16:48:54 GMT]]></title><description><![CDATA[<p>freddixx schrieb:</p>
<blockquote>
<p>Okay, habe mich über RAII belesen - erscheint mir auch sinnvoll. In Zukunft sollte ich also das Speicherbereitstellen über <code>new</code> unterlassen.</p>
<p>Wie kann ich dennoch das Kopieren großer Objekte vermeiden? Soll ich immer erst das Objekt erstellen und mir dann mit <code>&amp;</code> den Pointer holen? Oder ließe sich (besonders in diesem Szenrario) vollständig auf Pointer verzichten, ohne allzu krasse Geschwindigkeitseinbußen zu verzeichnen?</p>
</blockquote>
<p>Du könntest das Objekt auch direkt in deinem Container anlegen und dann mit Werten füllen.</p>
<blockquote>
<p>Und verstehe ich jetzt richtig: Wenn ich new nicht verwende, wird der Destruktor auch automatisch aufgerufen, wenn der Scope der Variable verlassen wird. Ich muss also nur dafür sorgen, dass der Destruktor ordentlich ist (Dateien schließen, usw)?</p>
</blockquote>
<p>Ja, der Destruktor wird aufgerufen, wenn das Objekt aus dem Scope fällt. Und der ruft auch automatisch die Destruktoren der enthaltenen Elemente auf - so daß du bei vernünftigen Klassen (Stichwort: RAII) auch die Aufräumarbeiten gratis bekommst.<br />
Wenn deine Klasse Speicher per new angefordert hat oder mit extern verwalteten Handles (z.B. FILE* aus der C &lt;stdio.h&gt;) arbeitet, mußt du die aber freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061886</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 11 May 2011 16:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Wed, 11 May 2011 17:41:50 GMT]]></title><description><![CDATA[<p>Und alle Klassen der STD enthalten ordentliche Destruktoren. Da brauchst du dir keine Sorgen zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2061917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2061917</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 11 May 2011 17:41:50 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 12 May 2011 06:24:02 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>new und delete brauchst du in C++ so gut wie nie.</p>
</blockquote>
<p>Wird dann nicht alles auf dem Stack angelegt wenn man so konsequent auf new verzichtet? Ich bin schon einige Jahre aus C++ raus und blicke nicht so ganz wie man heutzutage umfangreiche Datenmengen auf den Heap bekommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062040</guid><dc:creator><![CDATA[Minority Report]]></dc:creator><pubDate>Thu, 12 May 2011 06:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 12 May 2011 06:37:45 GMT]]></title><description><![CDATA[<p>Die Alternative zu new ist es ja nicht, alles auf den Stack zu schieben, sondern Container der Standardbibliothek und eigene RAII-Klassen zu nutzen, die die nötigen Freigaben selbständig im Destruktor vornehmen.<br />
Die fehleranfällige manuelle Speicherverwaltung entfällt somit komplett.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062043</guid><dc:creator><![CDATA[yahendrik]]></dc:creator><pubDate>Thu, 12 May 2011 06:37:45 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 12 May 2011 07:20:03 GMT]]></title><description><![CDATA[<p>Ok damit verlagere ich die new/delete Aufrufe in Konstruktor/Destruktor. Das ist ja überaus sinnvoll.<br />
Aber damit kann man doch nicht sagen, dass new/delete nicht mehr notwendig sind.</p>
<p>Oder verwendet man eine Art Factory, in der new/delete nochmals weggekapselt sind? Mit Templates sollte sowas ja möglich sein.</p>
<p>Gehen wir mal weg von Filehandles und dergleichen.<br />
Wie würde man, z.B. für ein Spiel, eine große Anzahl an Triangles und Vertices mit Hilfe von RAII anlegen und verwalten? Wo findet letztendlich die Speicherallokation statt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062053</guid><dc:creator><![CDATA[Minority Report]]></dc:creator><pubDate>Thu, 12 May 2011 07:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 12 May 2011 08:33:06 GMT]]></title><description><![CDATA[<p>Ein stl-Container kann nicht nur eingebaute Typen verwalten. Man könnte sich bspw. eine Klasse Triangle schreiben:</p>
<pre><code class="language-cpp">class Triangle
{
  float pos[3];
public:
  Triangle(float x=0, float y=0, float z=0);
  ...
};
</code></pre>
<p>Die Verwendung könnte so aussehen:</p>
<pre><code class="language-cpp">// 1
Triangle* pTriangles;

// 2
std::vector&lt;Triangle&gt; triangles;

..
// 1
pTriangles = new Triangle[300];
Triangle def;
for(size_t i=0;i&lt;300;++i)
  pTriangles[i] = def;
// 2
triangles.resize(300);
</code></pre>
<p>Ein ganz entscheidender Vorteil bietet sich, wenn man die Anzahl der Dreiecke erhöhen möchte</p>
<pre><code class="language-cpp">// 1, C++ bietet kein realloc
Triangle* pCpy = new Triangle[301];
memcpy(pCpy, pTriangle, 300*sizeof(Triangle);
delete [] pTriangle;
pTriangle = pCpy;
pTriangle[300] = Triangle(30,30,30);

// 2
triangles.push_back(Triangle(30,30,30));
</code></pre>
<p>Wichtig ist vor allem, dass bei der Verwendung eines vectors keine Geschwindigkeitsnachteile entstehen. Auch bisherige Schnittstellen kann man problemlos bedienen</p>
<pre><code class="language-cpp">void f(float* data, size_t size);

// 1
f(pTriangles, 300);
// 2
f(&amp;triangles[0], triangles.size());
</code></pre>
<p>Wenn stattdessen Zeiger verwendet werden sollen (bspw. um Polymorphie zu betreiben), kann auch ein Pointercontainer verwendet werden, der nicht nur den eigenen Speicherbereich freigibt, sondern darüberhinaus jedes einzelne Element zerstört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062072</guid><dc:creator><![CDATA[yahendrik]]></dc:creator><pubDate>Thu, 12 May 2011 08:33:06 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 12 May 2011 08:25:07 GMT]]></title><description><![CDATA[<p>Darauf wollte ich nicht hinaus.</p>
<p>Du hantierst wieder mit new und delete.<br />
Meine frage war, wie man sich dessen entledigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062077</guid><dc:creator><![CDATA[Minority Report]]></dc:creator><pubDate>Thu, 12 May 2011 08:25:07 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 12 May 2011 08:34:25 GMT]]></title><description><![CDATA[<p>Ich habe doch immer die Möglichkeit mit einem nackten Zeiger und darunter jeweils die Alternative mit einem vector gezeigt. Ich dachte, dies wäre ersichtlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062083</guid><dc:creator><![CDATA[yahendrik]]></dc:creator><pubDate>Thu, 12 May 2011 08:34:25 GMT</pubDate></item><item><title><![CDATA[Reply to Programm läuft einfach nicht weiter? on Thu, 12 May 2011 10:18:12 GMT]]></title><description><![CDATA[<p>yahendrik schrieb:</p>
<blockquote>
<p>Ich dachte, dies wäre ersichtlich.</p>
</blockquote>
<p>Ist es auch.</p>
<p>Nutze Container und RAII erledigt den Rest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062144</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Thu, 12 May 2011 10:18:12 GMT</pubDate></item></channel></rss>