<?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[Probleme mit std::vector]]></title><description><![CDATA[<p>Hallo,<br />
An den markierten Stelle steigt das Programm aus mit</p>
<pre><code>Program received signal SIGSEGV, Segmentation fault.
0x0043f83e in void std::_Construct&lt;Person*, Person*&gt;(Person**, Person* const&amp;)
    (__p=0x101, __value=@0x3e3e38)
    at C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_construct.h:81
81            ::new(static_cast&lt;void*&gt;(__p)) _T1(__value);

(gdb) bt
#0  0x0043f83e in void std::_Construct&lt;Person*, Person*&gt;(Person**, Person* const&amp;) (__p=0x101, __value=@0x3e3e38)
    at C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_construct.h:81
#1  0x0043da51 in std::vector&lt;Person*, std::allocator&lt;Person*&gt; &gt;::push_back(Person* const&amp;) (this=0x22fe7c, __x=@0x3e3e38)
    at C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_vector.h:560
#2  0x00401b6b in main () at cpu.cpp:106
</code></pre>
<p>ich verstehe nicht, warum sich der Vektor (s.u.) Dagegen sträubt, einen Person* aufzunehmen. Es liegt aber irgendwie am Vektor, wenn ich einen neuen erzeuge, funktioniert es, aber *nie* mit Film::personen. Wie kann das sein, wo ist der Unterschied, ob ich statt der Stelle schreibe:</p>
<pre><code class="language-cpp">vector&lt;Person*&gt; v;
v.push_back(new Person());
</code></pre>
<p>oder das schreibe was da unten steht? Aber leider funktioniert das da unten nicht, also muss da ja irgendwas noch anders sein...?</p>
<pre><code class="language-cpp">struct Film;
struct Person{
	string name;
	vector&lt;Film*&gt; filme;
	Person():
		name(),
		filme()
	{}
};
struct Film{
	string name;
	vector&lt;Person*&gt; personen;
	Film():
		name(),
		personen()
	{}
};
struct Person_ptr_vergleicher{
	string name;
	Person_ptr_vergleicher(Person*&amp; p):
		name(p-&gt;name)
	{}
	bool operator()(Person*&amp; p){
		return name == p-&gt;name;
	}
};
struct Film_ptr_vergleicher{
	string name;
	Film_ptr_vergleicher(Film*&amp; f):
		name(f-&gt;name)
	{}
	bool operator()(Film*&amp; f){
		return name == f-&gt;name;
	}
};
int main(){

	// Liste mit Namen, Filmen und deren Verbindung
	// Liste einlesen.
	vector&lt;Person*&gt; personen;
	vector&lt;Film*&gt; filme;
	ifstream cpu_daten(&quot;cpu-daten.txt&quot;);
	for(;;){
		string line;
		getline(cpu_daten, line);
		if(line.length() == 0)
			break;
		int delimPos = line.find_first_of('|');
		string name = line.substr(0, delimPos);
		string film = line.substr(delimPos + 1);
		// Nachdem die Liste eingelesen wurde, in Listen speichern.
		Person* neue_person = new Person();
		neue_person-&gt;name = name;
		Film* neuer_film;
		neuer_film-&gt;name = film;
		vector&lt;Person*&gt;::iterator person_iterator;
		vector&lt;Film*&gt;::iterator film_iterator;

		// Wenn bereits in Liste vorhanden, muss die Person/der Film nicht neu angelegt werden

		if((person_iterator = find_if(personen.begin(), personen.end(), Person_ptr_vergleicher(neue_person))) == personen.end()){
			personen.push_back(neue_person);
			person_iterator = personen.end() - 1;
		}
		else
			delete neue_person;
		if((film_iterator = find_if(filme.begin(), filme.end(), Film_ptr_vergleicher(neuer_film))) == filme.end()){
			filme.push_back(neuer_film);
			film_iterator = filme.end() - 1;
		}
		else
			delete neuer_film;
		// Anschliessend noch Person mit Film und umgekehrt assoziieren		
		(*person_iterator)-&gt;filme.push_back(*film_iterator);
=======&gt;(*film_iterator)-&gt;personen.push_back(*person_iterator);

	}
	return 0;
}
</code></pre>
<p>Woran kann das liegen?</p>
<p>Grüße,<br />
Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237230/probleme-mit-std-vector</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 14:27:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237230.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Mar 2009 00:23:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit std::vector on Thu, 26 Mar 2009 00:23:19 GMT]]></title><description><![CDATA[<p>Hallo,<br />
An den markierten Stelle steigt das Programm aus mit</p>
<pre><code>Program received signal SIGSEGV, Segmentation fault.
0x0043f83e in void std::_Construct&lt;Person*, Person*&gt;(Person**, Person* const&amp;)
    (__p=0x101, __value=@0x3e3e38)
    at C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_construct.h:81
81            ::new(static_cast&lt;void*&gt;(__p)) _T1(__value);

(gdb) bt
#0  0x0043f83e in void std::_Construct&lt;Person*, Person*&gt;(Person**, Person* const&amp;) (__p=0x101, __value=@0x3e3e38)
    at C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_construct.h:81
#1  0x0043da51 in std::vector&lt;Person*, std::allocator&lt;Person*&gt; &gt;::push_back(Person* const&amp;) (this=0x22fe7c, __x=@0x3e3e38)
    at C:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_vector.h:560
#2  0x00401b6b in main () at cpu.cpp:106
</code></pre>
<p>ich verstehe nicht, warum sich der Vektor (s.u.) Dagegen sträubt, einen Person* aufzunehmen. Es liegt aber irgendwie am Vektor, wenn ich einen neuen erzeuge, funktioniert es, aber *nie* mit Film::personen. Wie kann das sein, wo ist der Unterschied, ob ich statt der Stelle schreibe:</p>
<pre><code class="language-cpp">vector&lt;Person*&gt; v;
v.push_back(new Person());
</code></pre>
<p>oder das schreibe was da unten steht? Aber leider funktioniert das da unten nicht, also muss da ja irgendwas noch anders sein...?</p>
<pre><code class="language-cpp">struct Film;
struct Person{
	string name;
	vector&lt;Film*&gt; filme;
	Person():
		name(),
		filme()
	{}
};
struct Film{
	string name;
	vector&lt;Person*&gt; personen;
	Film():
		name(),
		personen()
	{}
};
struct Person_ptr_vergleicher{
	string name;
	Person_ptr_vergleicher(Person*&amp; p):
		name(p-&gt;name)
	{}
	bool operator()(Person*&amp; p){
		return name == p-&gt;name;
	}
};
struct Film_ptr_vergleicher{
	string name;
	Film_ptr_vergleicher(Film*&amp; f):
		name(f-&gt;name)
	{}
	bool operator()(Film*&amp; f){
		return name == f-&gt;name;
	}
};
int main(){

	// Liste mit Namen, Filmen und deren Verbindung
	// Liste einlesen.
	vector&lt;Person*&gt; personen;
	vector&lt;Film*&gt; filme;
	ifstream cpu_daten(&quot;cpu-daten.txt&quot;);
	for(;;){
		string line;
		getline(cpu_daten, line);
		if(line.length() == 0)
			break;
		int delimPos = line.find_first_of('|');
		string name = line.substr(0, delimPos);
		string film = line.substr(delimPos + 1);
		// Nachdem die Liste eingelesen wurde, in Listen speichern.
		Person* neue_person = new Person();
		neue_person-&gt;name = name;
		Film* neuer_film;
		neuer_film-&gt;name = film;
		vector&lt;Person*&gt;::iterator person_iterator;
		vector&lt;Film*&gt;::iterator film_iterator;

		// Wenn bereits in Liste vorhanden, muss die Person/der Film nicht neu angelegt werden

		if((person_iterator = find_if(personen.begin(), personen.end(), Person_ptr_vergleicher(neue_person))) == personen.end()){
			personen.push_back(neue_person);
			person_iterator = personen.end() - 1;
		}
		else
			delete neue_person;
		if((film_iterator = find_if(filme.begin(), filme.end(), Film_ptr_vergleicher(neuer_film))) == filme.end()){
			filme.push_back(neuer_film);
			film_iterator = filme.end() - 1;
		}
		else
			delete neuer_film;
		// Anschliessend noch Person mit Film und umgekehrt assoziieren		
		(*person_iterator)-&gt;filme.push_back(*film_iterator);
=======&gt;(*film_iterator)-&gt;personen.push_back(*person_iterator);

	}
	return 0;
}
</code></pre>
<p>Woran kann das liegen?</p>
<p>Grüße,<br />
Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686111</guid><dc:creator><![CDATA[piXelshooter]]></dc:creator><pubDate>Thu, 26 Mar 2009 00:23:19 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::vector on Thu, 26 Mar 2009 06:18:37 GMT]]></title><description><![CDATA[<p>Also was mir zuerst aufgefallen ist.<br />
Entweder du arbeitest mit alten POD´s dann halte dich aber auch an deren Logik, oder du benutzt das C++ äquvivalent <code>class</code> . Weiterhin, was soll das hier:</p>
<pre><code class="language-cpp">struct Person{
    string name;
    vector&lt;Film*&gt; filme;
    Person():
        name(),//wie wäre es wenn du die mal initialisierst
        filme()//das selbe hier.
    {}
};
</code></pre>
<p>Holy Crap !? Aber das bezieht sich schon auf das oben gesagte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686142</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Thu, 26 Mar 2009 06:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::vector on Thu, 26 Mar 2009 07:07:56 GMT]]></title><description><![CDATA[<p>piXelshooter schrieb:</p>
<blockquote>
<p>Film* neuer_film;<br />
neuer_film-&gt;name = film;</p>
</blockquote>
<p>Zugriff auf einen uninitialisierten Zeiger -&gt; Undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686150</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 26 Mar 2009 07:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::vector on Thu, 26 Mar 2009 13:15:42 GMT]]></title><description><![CDATA[<p>Firefighter schrieb:</p>
<blockquote>
<p>Entweder du arbeitest mit alten POD´s dann halte dich aber auch an deren Logik, oder du benutzt das C++ äquvivalent <code>class</code> .</p>
</blockquote>
<p><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="😕"
    /> was ist denn das für ein hinweis? was genau willst du damit sagen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686326</guid><dc:creator><![CDATA[PingPong]]></dc:creator><pubDate>Thu, 26 Mar 2009 13:15:42 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::vector on Thu, 26 Mar 2009 14:40:09 GMT]]></title><description><![CDATA[<p>danke, MFK. Ziehmlich bitter, dass ich das die ganze Zeit überlesen hab, ich dachte wohl, wenn ich <code>new Person()</code> geschrieben hab, habe ich auch <code>new Film()</code> geschrieben... Was mich ein wenig wundert ist, dass mein Compiler (gcc) nicht warnt, wenn ich einen nicht-initialiserten Pointer verwende. Dafür wird es dann wahrscheinlich einen Grund geben, nicht zu warnen, denn so ein Fehler sieht für aus, als würde er sich relativ schnell einschleichen und sich gut automatisch feststellen lassen.</p>
<p>Firefighter: Warum soll ich nicht <code>struct</code> nehmen? Ich dachte, struct sei wie <code>class</code> , nur dass standardmäßig auf <code>public</code> statt <code>private</code> ist. Ich weiß, ich sollte nicht direkt auf die Elementvariablen zugreifen, aber das Programm ist für eine kleine Aufgabe, daher denke ich, dass die Vorteile von »strengem« Vorgehen hier nicht wirklich zum Tragen kommen, die ganze Sache aber deutlich länger wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686374</guid><dc:creator><![CDATA[piXelshooter]]></dc:creator><pubDate>Thu, 26 Mar 2009 14:40:09 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::vector on Thu, 26 Mar 2009 14:32:57 GMT]]></title><description><![CDATA[<p>piXelshooter schrieb:</p>
<blockquote>
<p>Ich dachte, struct sei wie</p>
<pre><code class="language-cpp">class
</code></pre>
<p>, nur dass standardmäßig auf</p>
<pre><code class="language-cpp">public
</code></pre>
<p>statt</p>
<pre><code class="language-cpp">private
</code></pre>
<p>ist.</p>
</blockquote>
<p>Da liegst Du richtig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686379</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Thu, 26 Mar 2009 14:32:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit std::vector on Thu, 26 Mar 2009 18:56:07 GMT]]></title><description><![CDATA[<p>Firefighter schrieb:</p>
<blockquote>
<p>Also was mir zuerst aufgefallen ist.<br />
Entweder du arbeitest mit alten POD´s dann halte dich aber auch an deren Logik, oder du benutzt das C++ äquvivalent <code>class</code> .</p>
</blockquote>
<p>Sobald eine <code>class</code> oder <code>struct</code> Member enthält, die keine PODs sind (wie <code>std::string</code> oder <code>std::vector</code> ), ist sie auch selbst kein POD mehr, sondern ein Klassentyp. Und die explizite Initialisierung von Klassentypen ist nicht nötig, wenn diese einen Standardkonstruktor besitzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1686547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1686547</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 26 Mar 2009 18:56:07 GMT</pubDate></item></channel></rss>