<?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[dynamische rückgabe]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich habe eine Funktion, die mir die Schnittpunkte von zwei kreisen berechnet. meine Frage ist nur, welchen Datentyp soll ich zurückgeben, bzw wie soll ich die Rückgabe durchführen.</p>
<p>folgende Situationen sollen in der an der Rückgabe unterscheidbar sein:<br />
Kreis-A liegt in Kreis-B<br />
Kreis-B liegt in Kreis-A<br />
Kreis A und B haben keine Schnittpunkte<br />
Kreis A und B haben genau einen Schnittpunkt<br />
Kreis A und B haben genau zwei Schnittpunkte<br />
(wenn es Schnittpunkte gibt müssen die natürlich auch immer mit angegeben sein)</p>
<p>ich habe die Klassen Vertex und Circle, die alle wichtigen informationen für mich enthalten. Jede übergabe von Daten mache ich mithilfe von boost::smart_ptr, damit ich mich nicht mehr darum kümmern muss, wo ich welche Daten gespeichert habe.</p>
<p>ich habe es bisher ein Struct verwendet mit allen Informationen, aber seit ich meine Funktion weiter verschachtelt habe, sind die Destruktoren der Vertices aus einem mir unbekannten Grund Aufgerufen worden, und das Programm ist mit einem Segmentation Fault abgebrochen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251063/dynamische-rückgabe</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 11:11:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251063.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Sep 2009 19:44:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dynamische rückgabe on Mon, 28 Sep 2009 19:45:49 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich habe eine Funktion, die mir die Schnittpunkte von zwei kreisen berechnet. meine Frage ist nur, welchen Datentyp soll ich zurückgeben, bzw wie soll ich die Rückgabe durchführen.</p>
<p>folgende Situationen sollen in der an der Rückgabe unterscheidbar sein:<br />
Kreis-A liegt in Kreis-B<br />
Kreis-B liegt in Kreis-A<br />
Kreis A und B haben keine Schnittpunkte<br />
Kreis A und B haben genau einen Schnittpunkt<br />
Kreis A und B haben genau zwei Schnittpunkte<br />
(wenn es Schnittpunkte gibt müssen die natürlich auch immer mit angegeben sein)</p>
<p>ich habe die Klassen Vertex und Circle, die alle wichtigen informationen für mich enthalten. Jede übergabe von Daten mache ich mithilfe von boost::smart_ptr, damit ich mich nicht mehr darum kümmern muss, wo ich welche Daten gespeichert habe.</p>
<p>ich habe es bisher ein Struct verwendet mit allen Informationen, aber seit ich meine Funktion weiter verschachtelt habe, sind die Destruktoren der Vertices aus einem mir unbekannten Grund Aufgerufen worden, und das Programm ist mit einem Segmentation Fault abgebrochen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1785628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1785628</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Mon, 28 Sep 2009 19:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische rückgabe on Tue, 29 Sep 2009 16:06:20 GMT]]></title><description><![CDATA[<p>Für die Unterscheidung der Situationen bietet sich ein <code>enum</code> an. Da du höchstens zwei Punkte speicherst, scheint mir ein Container zu viel Overhead. Eine Möglichkeit wären zwei Zeiger, die Null sein können:</p>
<pre><code class="language-cpp">// Deine Punktklasse
struct Point
{
    float x;
    float y;
};

// Namensraum als Enum-Workaround, damit Qualifizierung möglich:
namespace Intersection
{
    enum Type
    {
        // ...
    };
}

// Klasse, die dein Schnittpunkt-Resultat hält
struct IntersectionResult
{
    Intersection::Type IntersectionType;
    Point*             PointA;
    Point*             PointB;
};
</code></pre>
<p>Hier der Einfachheit halber mal alles ungekapselte <code>struct</code> s. Hast du bereits was Ähnliches versucht? Vielleicht kannst du uns mehr zu deinem Destruktor-Problem sagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786064</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 29 Sep 2009 16:06:20 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische rückgabe on Wed, 07 Oct 2009 14:56:23 GMT]]></title><description><![CDATA[<p>so ähnlich habe ich das auch gelöst, und danke für den hinweiß für den Namespace, aber es lößt nicht mein Problem. Ich hab nochmal versuch das Problem zu minimieren.</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;boost/shared_ptr.hpp&gt;

using namespace std;
using namespace boost;

class Object{
public:
	int nr;
	Object(){
		static int counter = 0;
		nr = counter++;
		cout &lt;&lt; &quot;Create\t&quot; &lt;&lt; nr &lt;&lt; endl;
	}
	~Object(){
		cout &lt;&lt; &quot;Remove\t&quot; &lt;&lt; nr &lt;&lt; endl;
	}
};

typedef shared_ptr&lt;Object&gt; Pointer;

class Container{
public:
	Pointer o1;
	Pointer o2;
};

Container foo(){
	Container con;
	con.o1 = Pointer(new Object);
	con.o1 = Pointer(new Object);
	return con;
}

Container bar(){
	Container con1 , con2;
	con1 = foo();
	con2.o1 = Pointer(con1.o2);
	con2.o2 = Pointer(con2.o1);
	return con2;
}

int main(int argc, char** argv) {
	Container con = bar();
	cout &lt;&lt; &quot;ende&quot; &lt;&lt; endl;
}
</code></pre>
<pre><code>Create	0
Create	1
Remove	0
Remove	1
ende
[Press Enter to close window]
</code></pre>
<p>Warum sind die destruktoren vor dem Ende des Programms aufgerufen worden? Die Objecte sollten doch eingentlich noch gespeichert bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789286</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Wed, 07 Oct 2009 14:56:23 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische rückgabe on Wed, 07 Oct 2009 16:17:39 GMT]]></title><description><![CDATA[<p>Krux schrieb:</p>
<blockquote>
<p>Warum sind die destruktoren vor dem Ende des Programms aufgerufen worden? Die Objecte sollten doch eingentlich noch gespeichert bleiben.</p>
</blockquote>
<p>Nein. Du hast dich vertippt:</p>
<pre><code class="language-cpp">Container foo(){ 
    Container con; 
    con.o1 = Pointer(new Object); 
    con.o1 = Pointer(new Object);  // &lt;--
    return con; 
}
</code></pre>
<p>Und weil du in <code>bar()</code> nur <code>o2</code> kopierst, der nach wie vor ein Nullzeiger ist, werden die anderen Objekte normal bei Verlassen des Scopes zerstört. Explizite Kopierkonstruktoraufrufe sind übrigens nicht nötig, wenn du <code>shared_ptr</code> s einander zuweist. Das <code>Pointer(..)</code> kannst du also weglassen.</p>
<pre><code class="language-cpp">Container bar(){ 
    Container con1 , con2; 
    con1 = foo(); 
    con2.o1 = Pointer(con1.o2); // con1.o2 ist Null -&gt; con2.o1 auch
    con2.o2 = Pointer(con2.o1); // con2.o2 auch
    return con2; 
}
</code></pre>
<p>Was das Ganze mit deinem ursprünglichen Problem zu tun hat, entzieht sich meiner Kenntnis jedoch vollständig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789323</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 07 Oct 2009 16:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische rückgabe on Wed, 07 Oct 2009 16:59:43 GMT]]></title><description><![CDATA[<p>aua dämlich, danke habs korrigiert.<br />
ich glaub mein ursprüngliches Programm hat genau solche fehler da was vergessen, hier was falsch gemacht, und am ende nur noch Segmentation fault.</p>
<p>Jetzt hab ich aber schonmal eine funktionierende version, und ich weiß, dass es funktionieren kann, so wie ich es implementiert habe, ich muss nurnoch die tippfehler suchen.</p>
<p>Im Projekt ist das Object mein Vertex, Container mein IntersectionResult, foo und bar sind meine beiden verschachtelten Funtionen, um die Schnittpunkte der Kreise zu berechnen.</p>
<p>Edit:<br />
ja meine vermutung hat sich bestätigt, ich habe irgendwo ein return vergessen, und darum hat nichts mehr funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789329</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Wed, 07 Oct 2009 16:59:43 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische rückgabe on Wed, 07 Oct 2009 16:39:17 GMT]]></title><description><![CDATA[<p>Krux schrieb:</p>
<blockquote>
<p>Im Projekt ist das Object mein Vertex, Container mein IntersectionResult, foo und bar sind meine beiden verschachtelten Funtionen, um die Schnittpunkte der Kreise zu berechnen.</p>
</blockquote>
<p>Okay. Warum sagst du das nicht von Anfang an, sondern verwirrst mit irrelevanten Informationen (z.B. welche Kollisionstypen von Kreisen vorkommen sollen)? Darauf habe ich mich nämlich bei der ersten Antwort konzentriert.</p>
<p>Ich bin dir nicht böse, aber achte dich das nächste Mal bitte auf eine präzise Fragestellung, so hätte ich mir die Mühe sparen können.</p>
<p>P.S.:</p>
<p>Krux schrieb:</p>
<blockquote>
<p>Jede übergabe von Daten mache ich mithilfe von boost::smart_ptr, damit ich mich nicht mehr darum kümmern muss, wo ich welche Daten gespeichert habe.</p>
</blockquote>
<p>Nur der Faulheit wegen solltest du Smart-Pointer nicht benutzen. Bedenke auch, dass sie einen gewissen Overhead durch die Referenzzählung besitzen. Es gibt nicht wahnsinnig viele Anwendungsfälle, in denen wirklich Shared-Ownership-Semantik benötigt wird.</p>
<p>Wenn du dir bei der Speicherverwaltung nichts überlegen willst, nimm lieber gleich GC-Sprachen. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789331</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 07 Oct 2009 16:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische rückgabe on Wed, 07 Oct 2009 17:13:26 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Krux schrieb:</p>
<blockquote>
<p>Im Projekt ist das Object mein Vertex, Container mein IntersectionResult, foo und bar sind meine beiden verschachtelten Funtionen, um die Schnittpunkte der Kreise zu berechnen.</p>
</blockquote>
<p>Okay. Warum sagst du das nicht von Anfang an, sondern verwirrst mit irrelevanten Informationen (z.B. welche Kollisionstypen von Kreisen vorkommen sollen)? Darauf habe ich mich nämlich bei der ersten Antwort konzentriert.</p>
<p>Ich bin dir nicht böse, aber achte dich das nächste Mal bitte auf eine präzise Fragestellung, so hätte ich mir die Mühe sparen können.</p>
</blockquote>
<p>Hätte ich gewusst wo das Problem liegt hätte ich mir auch viel Arbeit sparen können, ich wusste es aber nicht, darum habe ich versucht alle Informationen zu geben, die zur Behebung des Problems behilflich sein könnten. letztlich war es ein Syntaxfehler, und keine meiner Informationen war relevant.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>P.S.:</p>
<p>Krux schrieb:</p>
<blockquote>
<p>Jede übergabe von Daten mache ich mithilfe von boost::smart_ptr, damit ich mich nicht mehr darum kümmern muss, wo ich welche Daten gespeichert habe.</p>
</blockquote>
<p>Nur der Faulheit wegen solltest du Smart-Pointer nicht benutzen. Bedenke auch, dass sie einen gewissen Overhead durch die Referenzzählung besitzen. Es gibt nicht wahnsinnig viele Anwendungsfälle, in denen wirklich Shared-Ownership-Semantik benötigt wird.</p>
<p>Wenn du dir bei der Speicherverwaltung nichts überlegen willst, nimm lieber gleich GC-Sprachen. :p</p>
</blockquote>
<p>Ich verwende C++, weil es dort mittlerweile so viele Brauchbare Bibliotheken gibt, und ich mich da schon gut eingearbeitet habe. Mit java habe ich dieses Projekt sogar angefangen, und ich habe festgestellt, dass ich das ganzo doch lieber auf C++ portieren wollte. Habe dann festgestellt, dass so wie ich es implementiert hatte es ohne GC nicht funktionieren kann, darum hab ich auch den Smart-Pointer eingesetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789336</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Wed, 07 Oct 2009 17:13:26 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische rückgabe on Wed, 07 Oct 2009 17:24:32 GMT]]></title><description><![CDATA[<p>Krux schrieb:</p>
<blockquote>
<p>Ich verwende C++, weil es dort mittlerweile so viele Brauchbare Bibliotheken gibt, und ich mich da schon gut eingearbeitet habe. Mit java habe ich dieses Projekt sogar angefangen, und ich habe festgestellt, dass ich das ganzo doch lieber auf C++ portieren wollte. Habe dann festgestellt, dass so wie ich es implementiert hatte es ohne GC nicht funktionieren kann, darum hab ich auch den Smart-Pointer eingesetzt.</p>
</blockquote>
<p>Ich finde es gut, dass es doch noch Leute gibt, die von Java nach C++ portieren. <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>Du solltest einfach dran denken, dass man hier von Grund auf andere Konzepte verfolgt (z.B. Templates, RAII) und man in C++ ganz anders als in Java programmiert. <code>boost::shared_ptr</code> ist auch kein Ersatz für einen Garbage-Collector, selbst wenn er die Speicherverwaltung erleichtert. Also nicht immer nur Smart-Pointers verwenden - es gibt oft elegantere Wege, die dir noch weniger Arbeit mit dem Speicher aufhalsen. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1789340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1789340</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 07 Oct 2009 17:24:32 GMT</pubDate></item></channel></rss>