<?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[Speicherzugriffsfehler bei map]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe einen Algorithmus der eine Map zurückgibt. Leider bekomme ich Speicherzugriffsfehler beim Zugriff auf die Map. Ich hab großteile des Codes auskommentiert um die Fehler einzugrenzen habe schon ein paar Stellen gefunden:</p>
<pre><code class="language-cpp">template&lt;class monomialOrdering&gt;
	static const map&lt;int, MultivariatePolynomial&lt;monomialOrdering&gt; &gt; signedSubresultant(
			const MultivariatePolynomial&lt;monomialOrdering&gt; &amp;P,
			const MultivariatePolynomial&lt;monomialOrdering&gt; &amp;Q,
			const symbol &amp;sym) {

		int p = P.degree();
		int q = Q.degree();
		int p_q = p - q;
		map&lt;int, MultivariatePolynomial&lt;monomialOrdering&gt; &gt; sResP;
		map&lt;int, numeric&gt; s;
		map&lt;int, numeric&gt; t;
		list &lt; symbol &gt; no_symbols;
		list &lt; symbol &gt; both_symbols(Q.mergeVariables(P.Variables())); // &lt;- Hier

		sResP[p] = P;

		s[p] = ex_to &lt; numeric &gt; (P.lcoeff() &gt; 0 ? 1 : -1);

		sResP[p - 1] = Q;

		t[p - 1] = ex_to &lt; numeric &gt; (Q.lcoeff());

		numeric epsilon_p_q = ex_to &lt; numeric &gt; (pow(-1, p_q * (p_q - 1) / 2));
		ex factor = ex_to &lt; numeric &gt; (pow(p - q - 1, Q.lcoeff()));

		MultivariatePolynomial&lt;monomialOrdering&gt; factor_p(factor, no_symbols);
		sResP[q] = Q.mul(factor_p); // &lt;- Hier!

//		Ganz viel auskommentierter Code ...	

		return sResP;
}
</code></pre>
<p>Ich weiß, dass ein bisschen schwierig ohne den Restcode zu kennen, aber vllt mache ich ja einen grundsätzlichen Fehler.</p>
<p>Als Beispiel hier die Implementierung von mul</p>
<pre><code class="language-cpp">template&lt;class monomialOrdering&gt;
const MultivariatePolynomial&lt;monomialOrdering&gt; MultivariatePolynomial&lt;monomialOrdering&gt;::mul(const MultivariatePolynomial&lt;monomialOrdering&gt;&amp; o) const throw(invalid_argument)
{
    return MultivariatePolynomial&lt;monomialOrdering&gt;(static_cast&lt;ex&gt;(*this) * static_cast&lt;ex&gt;(o), mergeVariables(o.mVariables));
}
</code></pre>
<p>Hat jemand eine idee was ich falsch mache?</p>
<p>Vielen Dank</p>
<p>Joachim</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289725/speicherzugriffsfehler-bei-map</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 23:51:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289725.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Jul 2011 17:19:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Mon, 11 Jul 2011 17:19:44 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe einen Algorithmus der eine Map zurückgibt. Leider bekomme ich Speicherzugriffsfehler beim Zugriff auf die Map. Ich hab großteile des Codes auskommentiert um die Fehler einzugrenzen habe schon ein paar Stellen gefunden:</p>
<pre><code class="language-cpp">template&lt;class monomialOrdering&gt;
	static const map&lt;int, MultivariatePolynomial&lt;monomialOrdering&gt; &gt; signedSubresultant(
			const MultivariatePolynomial&lt;monomialOrdering&gt; &amp;P,
			const MultivariatePolynomial&lt;monomialOrdering&gt; &amp;Q,
			const symbol &amp;sym) {

		int p = P.degree();
		int q = Q.degree();
		int p_q = p - q;
		map&lt;int, MultivariatePolynomial&lt;monomialOrdering&gt; &gt; sResP;
		map&lt;int, numeric&gt; s;
		map&lt;int, numeric&gt; t;
		list &lt; symbol &gt; no_symbols;
		list &lt; symbol &gt; both_symbols(Q.mergeVariables(P.Variables())); // &lt;- Hier

		sResP[p] = P;

		s[p] = ex_to &lt; numeric &gt; (P.lcoeff() &gt; 0 ? 1 : -1);

		sResP[p - 1] = Q;

		t[p - 1] = ex_to &lt; numeric &gt; (Q.lcoeff());

		numeric epsilon_p_q = ex_to &lt; numeric &gt; (pow(-1, p_q * (p_q - 1) / 2));
		ex factor = ex_to &lt; numeric &gt; (pow(p - q - 1, Q.lcoeff()));

		MultivariatePolynomial&lt;monomialOrdering&gt; factor_p(factor, no_symbols);
		sResP[q] = Q.mul(factor_p); // &lt;- Hier!

//		Ganz viel auskommentierter Code ...	

		return sResP;
}
</code></pre>
<p>Ich weiß, dass ein bisschen schwierig ohne den Restcode zu kennen, aber vllt mache ich ja einen grundsätzlichen Fehler.</p>
<p>Als Beispiel hier die Implementierung von mul</p>
<pre><code class="language-cpp">template&lt;class monomialOrdering&gt;
const MultivariatePolynomial&lt;monomialOrdering&gt; MultivariatePolynomial&lt;monomialOrdering&gt;::mul(const MultivariatePolynomial&lt;monomialOrdering&gt;&amp; o) const throw(invalid_argument)
{
    return MultivariatePolynomial&lt;monomialOrdering&gt;(static_cast&lt;ex&gt;(*this) * static_cast&lt;ex&gt;(o), mergeVariables(o.mVariables));
}
</code></pre>
<p>Hat jemand eine idee was ich falsch mache?</p>
<p>Vielen Dank</p>
<p>Joachim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091458</guid><dc:creator><![CDATA[SegFaultJo]]></dc:creator><pubDate>Mon, 11 Jul 2011 17:19:44 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Mon, 11 Jul 2011 21:55:56 GMT]]></title><description><![CDATA[<p>Schwierig zu sagen. Bist du sicher, dass die <code>static_cast&lt;ex&gt;</code> immer funktionieren? Was für einen Speicherzugriffsfehler erhältst du? Hat deine STL-Implementierung vielleicht Assertions, die dich im Debug-Modus auf Logikfehler hinweisen?</p>
<p>Übrigens: <a href="http://www.c-plusplus.net/forum/261921" rel="nofollow">Verwende keine Exception-Spezifikationen</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091577</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 11 Jul 2011 21:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Mon, 11 Jul 2011 22:58:01 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Schwierig zu sagen. Bist du sicher, dass die <code>static_cast&lt;ex&gt;</code> immer funktionieren? Was für einen Speicherzugriffsfehler erhältst du? Hat deine STL-Implementierung vielleicht Assertions, die dich im Debug-Modus auf Logikfehler hinweisen?</p>
<p>Übrigens: <a href="http://www.c-plusplus.net/forum/261921" rel="nofollow">Verwende keine Exception-Spezifikationen</a>.</p>
</blockquote>
<p>Bei den static_casts bin ich mir ziemlich sicher. Der Code ist nicht von mir und ziemlich intensiv getestet. Ich dachte eher daran, dass die Elemente in der Map nach dem beenden der Methode irgendwie nicht mehr zur Verfügung stehen. Kann das sein?</p>
<p>In der Konsole steht einfach &quot;Speicherzugriffsfehler&quot;, wenn ich das Programm ausführe. Der ausführbare Code, der die Funktion benutzt, sieht an der entscheidenden Stelle so aus:</p>
<pre><code class="language-cpp">map&lt;int, MultivariatePolynomial&lt;ex_is_lesseq_deggrlex&gt; &gt; m =
			MultivariatePolynomialFactory::signedSubresultant(p, p.diff(x), x);

	map&lt;int, MultivariatePolynomial&lt;ex_is_lesseq_deggrlex&gt; &gt;::const_iterator it;

	for (it = m.begin(); it != m.end(); ++it)
		cout &lt;&lt; it-&gt;second &lt;&lt; endl;
</code></pre>
<p>Meine STL Implementierung ist, die von g++ (wenn man das so sagen kann). Wo nach muss ich da suchen?</p>
<p>Vielleicht muss ich mich mal mit Debugging auseinandersetzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091591</guid><dc:creator><![CDATA[PolynomJo]]></dc:creator><pubDate>Mon, 11 Jul 2011 22:58:01 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 00:02:55 GMT]]></title><description><![CDATA[<p>PolynomJo schrieb:</p>
<blockquote>
<p>Ich dachte eher daran, dass die Elemente in der Map nach dem beenden der Methode irgendwie nicht mehr zur Verfügung stehen. Kann das sein?</p>
</blockquote>
<p>Ja, wenn du die Map lokal deklarierst, lebt sie nur bis zum Ende des Blocks. Daher musst du aufpassen, dass nachher keine Zeiger, Referenzen und Iteratoren mehr benutzt werden, die immer noch auf die Map verweisen.</p>
<p>PolynomJo schrieb:</p>
<blockquote>
<p>Meine STL Implementierung ist, die von g++ (wenn man das so sagen kann). Wo nach muss ich da suchen?</p>
</blockquote>
<p>Mit der g++-Standardbibliothek kenne ich mich nicht gut aus, aber möglicherweise sind im Debug-Modus (Makro <code>NDEBUG</code> nicht definiert) einige Sicherheitsmechanismen automatisch an. Ansonsten ist das Kennenlernen eines Debuggers sicher keine schlechte Idee. Je nachdem, was für eine IDE du verwendest, geht das auch grafisch. Ich bin halt von Visual Studio verwöhnt <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/2091594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091594</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 12 Jul 2011 00:02:55 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 09:38:07 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ja, wenn du die Map lokal deklarierst, lebt sie nur bis zum Ende des Blocks. Daher musst du aufpassen, dass nachher keine Zeiger, Referenzen und Iteratoren mehr benutzt werden, die immer noch auf die Map verweisen.</p>
</blockquote>
<p>Genau das mache ich aber. Und solange ich nur sowas mache:</p>
<pre><code class="language-cpp">sResP[p] = P;
</code></pre>
<p>Klappt das auch einfach und ich sehe es dann in der Map. Warum nicht bei komplizierteren, errechneten Audrücken?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091684</guid><dc:creator><![CDATA[PolynomJo]]></dc:creator><pubDate>Tue, 12 Jul 2011 09:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 09:43:10 GMT]]></title><description><![CDATA[<p>PolynomJo schrieb:</p>
<blockquote>
<p>Genau das mache ich aber.</p>
</blockquote>
<p>Dann solltest du damit aufhören.</p>
<p>PolynomJo schrieb:</p>
<blockquote>
<p>Und solange ich nur sowas mache:</p>
<pre><code class="language-cpp">sResP[p] = P;
</code></pre>
<p>Klappt das auch einfach und ich sehe es dann in der Map.</p>
</blockquote>
<p>Hier greifst du ja nicht auf ungültige Zeiger/Referenzen/Iteratoren zu, warum sollte es also nicht klappen? Das Problem entsteht erst, wenn einzelne Elemente oder die ganze Map gelöscht wird und noch Verweise darauf bestehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091686</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 12 Jul 2011 09:43:10 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 09:43:21 GMT]]></title><description><![CDATA[<p>was ist ex? wie ist dein MultivariateDingsda definiert?<br />
Das sieht aus als ob der Zugriff auf variables irgendwo danebenhaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091687</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 12 Jul 2011 09:43:21 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 09:49:40 GMT]]></title><description><![CDATA[<p>Bist du sicher, dass der Fehler bei der Map liegt und nicht in &quot; Q.mul(factor_p)&quot;?</p>
<p>Ersetze doch mal</p>
<pre><code class="language-cpp">sResP[q] = Q.mul(factor_p);
</code></pre>
<p>durch</p>
<pre><code class="language-cpp">MultivariatePolynomial&lt;monomialOrdering&gt; xyz = Q.mul(factor_p);
sResP[q] = = xyz;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2091692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091692</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 12 Jul 2011 09:49:40 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 09:52:35 GMT]]></title><description><![CDATA[<p>einen Debugger dranzuhängen sollte auch genau zeigen, wo der Zugriffsfehler passiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091694</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 12 Jul 2011 09:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 14:05:51 GMT]]></title><description><![CDATA[<p>Oke, danke! Der Debugger hilft, denn er weißt auf ganz merkwürdige Fehler hin:</p>
<pre><code class="language-cpp">cout &lt;&lt; p.degree(x) &lt;&lt; endl;
	cout &lt;&lt; p.diff(x).degree(x) &lt;&lt; endl;

	map&lt;int, MultivariatePolynomial&lt;ex_is_lesseq_deggrlex&gt; &gt; m =
			MultivariatePolynomialFactory::signedSubresultant(p, p.diff(x), x);
</code></pre>
<p>Dieses Programm habe ich ausgeführt und es gibt als Ausgabe 2 und 1, was richtig ist, denn es ist ein quadratisches Polynom in x.</p>
<p>Innerhalb der Methode signedSubresultant, wenn ich mit dem Debugger darein gehe, haben die Variables p und q aber beide den Wert 4 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Ich benutze exakt den gleichen Funktionsaufruf .degree(...). Was ist das los?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091867</guid><dc:creator><![CDATA[PolynomJo]]></dc:creator><pubDate>Tue, 12 Jul 2011 14:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 15:59:22 GMT]]></title><description><![CDATA[<p>Könnten wir eventuell mal sehen, was sich genau hinter p und x verbirgt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091926</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 12 Jul 2011 15:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 16:16:24 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Könnten wir eventuell mal sehen, was sich genau hinter p und x verbirgt?</p>
</blockquote>
<p>Klar, sorry das ist alles so viel Code ich will euch nur nicht überfluten <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>
<pre><code class="language-cpp">GiNaC::symbol x(&quot;x&quot;);

MultivariatePolynomial&lt;ex_is_lesseq_deggrlex&gt; p(
			8 * x * x * y * -2 * y * y * y + 5, l);
</code></pre>
<p>MultivariatePolynomial&lt;...&gt; ist eine Klasse die von GiNaC::ex geerbt ist und überprüft, ob es sich um eine Polynom handelt. ex_is_lesseq_deggrlex definiert eine Ordnung.</p>
<p><a href="http://www.ginac.de/reference/classGiNaC_1_1symbol.html" rel="nofollow">http://www.ginac.de/reference/classGiNaC_1_1symbol.html</a> &lt;- symbol<br />
<a href="http://www.ginac.de/reference/classGiNaC_1_1ex.html" rel="nofollow">http://www.ginac.de/reference/classGiNaC_1_1ex.html</a> &lt;- ex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091936</guid><dc:creator><![CDATA[PolynomJo]]></dc:creator><pubDate>Tue, 12 Jul 2011 16:16:24 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriffsfehler bei map on Tue, 12 Jul 2011 16:21:04 GMT]]></title><description><![CDATA[<p>Autsch! degree() wertet nach der falschen Variable aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2091940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2091940</guid><dc:creator><![CDATA[PolynomJo]]></dc:creator><pubDate>Tue, 12 Jul 2011 16:21:04 GMT</pubDate></item></channel></rss>