<?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[vector in einer Klasse]]></title><description><![CDATA[<p>Tach Zusammen,<br />
hatte vor kurzem schon einmal deswegen gefragt, sind aber leider nicht zur Lösung gekommen.</p>
<p>mein Objekt ist wie folgt aufgebaut</p>
<pre><code class="language-cpp">int main(int argc, char *argv[]) {

   std::vector&lt;mStructure&gt; structureList; // Vector from my class

   ...
}

class mStructure{
   ...
private:
   int structureID_;
   int numTraces_;
   std::string name_;
   int color_;
   mTrace trace_;
};

class mTrace{
   ...
private:
   int traceID_;
   int color_;
   int numPoints_;
   std::vector&lt;mPoint&gt; points_;
};
</code></pre>
<p>Problem ist nun, dass ich den Vektor vom Typ <em>mStrucutere</em> am Anfang anlege und später erst die Daten einlese. Beim einlesen erfahre ich aber erst wieviele Punkte in <em>mTrace</em> eingelesen werden. Doch der erste Eintrag von dem Vektor <em>points_</em> verändert sich immer. Ich vermute, dass beim Programmstart Speicherbereich für <em>structureList</em> festgelegt wird und wenn ich im späteren Verlauf Punkte mittels push_back() hinzufüge, es eigentlich zu einer Bereichsüberschreitung kommt. Mich irritiert nur, dass die anderen Elemente vom Vektor <em>points_</em> in Ordnung sind, nur der erste Eintrag ist falsch. Hat jmd eine Idee, wie ich das beheben kann? Oder ggf ein anderes Design?</p>
<pre><code>&lt;SectionTracer numStructures=&quot;6&quot;&gt;
  &lt;Structure structureID=&quot;0&quot; numTraces=&quot;1&quot; name=&quot;2a_outer&quot; color=&quot;-256&quot;&gt;
    &lt;Trace traceID=&quot;1&quot; color=&quot;-256&quot; numPoints=&quot;45&quot;&gt;
      &lt;Point num=&quot;0&quot;&gt;4949 1751&lt;/Point&gt;
      &lt;Point num=&quot;1&quot;&gt;4977 1676&lt;/Point&gt;
      &lt;Point num=&quot;2&quot;&gt;5005 1608&lt;/Point&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/233956/vector-in-einer-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 14:24:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233956.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Feb 2009 11:56:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vector in einer Klasse on Wed, 11 Feb 2009 11:56:47 GMT]]></title><description><![CDATA[<p>Tach Zusammen,<br />
hatte vor kurzem schon einmal deswegen gefragt, sind aber leider nicht zur Lösung gekommen.</p>
<p>mein Objekt ist wie folgt aufgebaut</p>
<pre><code class="language-cpp">int main(int argc, char *argv[]) {

   std::vector&lt;mStructure&gt; structureList; // Vector from my class

   ...
}

class mStructure{
   ...
private:
   int structureID_;
   int numTraces_;
   std::string name_;
   int color_;
   mTrace trace_;
};

class mTrace{
   ...
private:
   int traceID_;
   int color_;
   int numPoints_;
   std::vector&lt;mPoint&gt; points_;
};
</code></pre>
<p>Problem ist nun, dass ich den Vektor vom Typ <em>mStrucutere</em> am Anfang anlege und später erst die Daten einlese. Beim einlesen erfahre ich aber erst wieviele Punkte in <em>mTrace</em> eingelesen werden. Doch der erste Eintrag von dem Vektor <em>points_</em> verändert sich immer. Ich vermute, dass beim Programmstart Speicherbereich für <em>structureList</em> festgelegt wird und wenn ich im späteren Verlauf Punkte mittels push_back() hinzufüge, es eigentlich zu einer Bereichsüberschreitung kommt. Mich irritiert nur, dass die anderen Elemente vom Vektor <em>points_</em> in Ordnung sind, nur der erste Eintrag ist falsch. Hat jmd eine Idee, wie ich das beheben kann? Oder ggf ein anderes Design?</p>
<pre><code>&lt;SectionTracer numStructures=&quot;6&quot;&gt;
  &lt;Structure structureID=&quot;0&quot; numTraces=&quot;1&quot; name=&quot;2a_outer&quot; color=&quot;-256&quot;&gt;
    &lt;Trace traceID=&quot;1&quot; color=&quot;-256&quot; numPoints=&quot;45&quot;&gt;
      &lt;Point num=&quot;0&quot;&gt;4949 1751&lt;/Point&gt;
      &lt;Point num=&quot;1&quot;&gt;4977 1676&lt;/Point&gt;
      &lt;Point num=&quot;2&quot;&gt;5005 1608&lt;/Point&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1661655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661655</guid><dc:creator><![CDATA[Flaut]]></dc:creator><pubDate>Wed, 11 Feb 2009 11:56:47 GMT</pubDate></item><item><title><![CDATA[Reply to vector in einer Klasse on Wed, 11 Feb 2009 12:00:15 GMT]]></title><description><![CDATA[<p>Beim push_back kann es eigentlich zu keiner Bereichsüberschreitung kommen. Höchstens wenn der Speicher voll ausgereizt ist.<br />
Wie äußert sich denn dein Problem (Code)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661659</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 11 Feb 2009 12:00:15 GMT</pubDate></item><item><title><![CDATA[Reply to vector in einer Klasse on Wed, 11 Feb 2009 12:27:58 GMT]]></title><description><![CDATA[<p>Ich bekomme folgende Ausgabe beim einlesen</p>
<pre><code>TraceID: 1 Color: -256 NumPoints: 45
X: 17 Y: 0
X: 4949 Y: 1751
TraceID: 1 Color: -256 NumPoints: 45
X: 210 Y: 0
X: 4949 Y: 1751
X: 4977 Y: 1676
TraceID: 1 Color: -256 NumPoints: 45
X: 152 Y: 0
X: 4949 Y: 1751
X: 4977 Y: 1676
X: 5005 Y: 1608
...
</code></pre>
<p>Achso, zu erwähnen wäre, dass ich auf Grund des Fehlers ein leeres Objekt hinzufüge.</p>
<pre><code class="language-cpp">if (result-&gt;points().empty()) {// TODO Speicherkorrektur
		result-&gt;addPoint(mPoint(0, 0));
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1661676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661676</guid><dc:creator><![CDATA[Flaut]]></dc:creator><pubDate>Wed, 11 Feb 2009 12:27:58 GMT</pubDate></item><item><title><![CDATA[Reply to vector in einer Klasse on Wed, 11 Feb 2009 12:28:27 GMT]]></title><description><![CDATA[<p>Wie liest du denn ein? Entspricht das alles noch dem Code in deinem vorigen Post?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661677</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 11 Feb 2009 12:28:27 GMT</pubDate></item><item><title><![CDATA[Reply to vector in einer Klasse on Wed, 11 Feb 2009 12:34:41 GMT]]></title><description><![CDATA[<p>Ich arbeite mit TinyXML. Wegen der Übersicht, habe ich die Funktionen in verschiedene Blöcke gefasst. Sie sind aber bei mir in einem File.</p>
<pre><code class="language-cpp">void read_xml(const char *pFilename, vector&lt;mStructure&gt; &amp;structureList,	mPNGinfo &amp;fi) {

	//open file
	TiXmlDocument doc(pFilename);
	if (!doc.LoadFile())
		throw runtime_error(string(&quot;can't read &quot;) + pFilename);

	//check correctness of file
	TiXmlElement *root = doc.RootElement();
	if (strcmp(root-&gt;Value(), &quot;SectionTracer&quot;) != 0)
		throw runtime_error(string(&quot;wrong root &quot;) + root-&gt;Value());

	//read filename
	TiXmlElement* e = root-&gt;FirstChildElement();
	if (e &amp;&amp; strcmp(e-&gt;Value(), &quot;Filename&quot;) == 0) {
		fi.setName(textValue(e));
	} else {
		throw runtime_error(&quot;error filename&quot;);
	}

   ...

	//read Structures
	for (TiXmlElement* element = e-&gt;NextSiblingElement(); element; element = element-&gt;NextSiblingElement()){
		structureList.push_back(nodeToStructure(element));
	}

}
</code></pre>
<pre><code class="language-cpp">mStructure nodeToStructure(TiXmlElement* e) {

	if (strcmp(e-&gt;Value(), &quot;Structure&quot;) != 0)
		throw runtime_error(string(&quot;wrong structure &quot;) + e-&gt;Value());

	mStructure *result = new mStructure;

   ...

	result-&gt;setTrace(nodeToTrace(e-&gt;FirstChildElement()));

	return *result;
}
</code></pre>
<pre><code class="language-cpp">mTrace nodeToTrace(TiXmlElement* e) {

	if (strcmp(e-&gt;Value(), &quot;Trace&quot;) != 0)
		throw runtime_error(string(&quot;wrong trace &quot;) + e-&gt;Value());

	mTrace *result = new mTrace;
	const char *traceID, *color, *numPoints;

	//read Parameter
	traceID = e-&gt;Attribute(&quot;traceID&quot;);
	if (traceID != NULL)
		result-&gt;setTraceID(atoi(traceID));
	else
		throw runtime_error(string(&quot;wrong traceID &quot;) + e-&gt;Value());

	color = e-&gt;Attribute(&quot;color&quot;);
	if (color != NULL)
		result-&gt;setColor(atoi(color));
	else
		throw runtime_error(string(&quot;wrong color &quot;) + e-&gt;Value());

	numPoints = e-&gt;Attribute(&quot;numPoints&quot;);
	if (numPoints != NULL)
		result-&gt;setNumPoints(atoi(numPoints));
	else
		throw runtime_error(string(&quot;wrong numPoints &quot;) + e-&gt;Value());

	if (result-&gt;points().empty()) {// TODO Speicherkorrektur
		result-&gt;addPoint(mPoint(0, 0));
	}

	for (TiXmlElement* element = e-&gt;FirstChildElement(); element; element = element-&gt;NextSiblingElement()) {
		result-&gt;addPoint(nodeToPoint(element));
		cout &lt;&lt; *result;
	}

	return *result;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1661687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661687</guid><dc:creator><![CDATA[Flaut]]></dc:creator><pubDate>Wed, 11 Feb 2009 12:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to vector in einer Klasse on Wed, 11 Feb 2009 13:05:11 GMT]]></title><description><![CDATA[<p>Was macht denn addPoint(), ein einfaches push_back?<br />
Warum erzeugst du die mStructure und mTrace mit new wenn du sie dann eh als Kopie zurückgibst. Du bastelst dir damit Speicherlecks.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661719</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 11 Feb 2009 13:05:11 GMT</pubDate></item><item><title><![CDATA[Reply to vector in einer Klasse on Wed, 11 Feb 2009 14:17:24 GMT]]></title><description><![CDATA[<p>Ja addPoint macht ein einfaches push_back()</p>
<pre><code class="language-cpp">void addPoint(const mPoint &amp;pt){points_.push_back(pt);};
</code></pre>
<p>new hatte ich gemacht, weil mir das jmd empfohlen hatte. Das sollte den Speicherfehler beheben. Hat aber wie man sieht nichts gebracht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661796</guid><dc:creator><![CDATA[Flaut]]></dc:creator><pubDate>Wed, 11 Feb 2009 14:17:24 GMT</pubDate></item><item><title><![CDATA[Reply to vector in einer Klasse on Wed, 11 Feb 2009 17:46:12 GMT]]></title><description><![CDATA[<p>Flaut schrieb:</p>
<blockquote>
<p>new hatte ich gemacht, weil mir das jmd empfohlen hatte. Das sollte den Speicherfehler beheben. Hat aber wie man sieht nichts gebracht.</p>
</blockquote>
<p>Dann hat dich da aber jemand ziemlich an der Nase rumgeführt.. Mit new forderst du Speicher an, den du selbst verwalten musst. Und wenn du ihn nicht freigibst, hast du erst Recht ein Speicherleck..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1661976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1661976</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 11 Feb 2009 17:46:12 GMT</pubDate></item></channel></rss>