Speicherzugriffsfehler bei map
-
Hi,
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:
template<class monomialOrdering> static const map<int, MultivariatePolynomial<monomialOrdering> > signedSubresultant( const MultivariatePolynomial<monomialOrdering> &P, const MultivariatePolynomial<monomialOrdering> &Q, const symbol &sym) { int p = P.degree(); int q = Q.degree(); int p_q = p - q; map<int, MultivariatePolynomial<monomialOrdering> > sResP; map<int, numeric> s; map<int, numeric> t; list < symbol > no_symbols; list < symbol > both_symbols(Q.mergeVariables(P.Variables())); // <- Hier sResP[p] = P; s[p] = ex_to < numeric > (P.lcoeff() > 0 ? 1 : -1); sResP[p - 1] = Q; t[p - 1] = ex_to < numeric > (Q.lcoeff()); numeric epsilon_p_q = ex_to < numeric > (pow(-1, p_q * (p_q - 1) / 2)); ex factor = ex_to < numeric > (pow(p - q - 1, Q.lcoeff())); MultivariatePolynomial<monomialOrdering> factor_p(factor, no_symbols); sResP[q] = Q.mul(factor_p); // <- Hier! // Ganz viel auskommentierter Code ... return sResP; }Ich weiß, dass ein bisschen schwierig ohne den Restcode zu kennen, aber vllt mache ich ja einen grundsätzlichen Fehler.
Als Beispiel hier die Implementierung von mul
template<class monomialOrdering> const MultivariatePolynomial<monomialOrdering> MultivariatePolynomial<monomialOrdering>::mul(const MultivariatePolynomial<monomialOrdering>& o) const throw(invalid_argument) { return MultivariatePolynomial<monomialOrdering>(static_cast<ex>(*this) * static_cast<ex>(o), mergeVariables(o.mVariables)); }Hat jemand eine idee was ich falsch mache?
Vielen Dank
Joachim
-
Schwierig zu sagen. Bist du sicher, dass die
static_cast<ex>immer funktionieren? Was für einen Speicherzugriffsfehler erhältst du? Hat deine STL-Implementierung vielleicht Assertions, die dich im Debug-Modus auf Logikfehler hinweisen?Übrigens: Verwende keine Exception-Spezifikationen.
-
Nexus schrieb:
Schwierig zu sagen. Bist du sicher, dass die
static_cast<ex>immer funktionieren? Was für einen Speicherzugriffsfehler erhältst du? Hat deine STL-Implementierung vielleicht Assertions, die dich im Debug-Modus auf Logikfehler hinweisen?Übrigens: Verwende keine Exception-Spezifikationen.
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?
In der Konsole steht einfach "Speicherzugriffsfehler", wenn ich das Programm ausführe. Der ausführbare Code, der die Funktion benutzt, sieht an der entscheidenden Stelle so aus:
map<int, MultivariatePolynomial<ex_is_lesseq_deggrlex> > m = MultivariatePolynomialFactory::signedSubresultant(p, p.diff(x), x); map<int, MultivariatePolynomial<ex_is_lesseq_deggrlex> >::const_iterator it; for (it = m.begin(); it != m.end(); ++it) cout << it->second << endl;Meine STL Implementierung ist, die von g++ (wenn man das so sagen kann). Wo nach muss ich da suchen?
Vielleicht muss ich mich mal mit Debugging auseinandersetzen

-
PolynomJo schrieb:
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?
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.
PolynomJo schrieb:
Meine STL Implementierung ist, die von g++ (wenn man das so sagen kann). Wo nach muss ich da suchen?
Mit der g++-Standardbibliothek kenne ich mich nicht gut aus, aber möglicherweise sind im Debug-Modus (Makro
NDEBUGnicht 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
-
Nexus schrieb:
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.
Genau das mache ich aber. Und solange ich nur sowas mache:
sResP[p] = P;Klappt das auch einfach und ich sehe es dann in der Map. Warum nicht bei komplizierteren, errechneten Audrücken?
-
PolynomJo schrieb:
Genau das mache ich aber.
Dann solltest du damit aufhören.
PolynomJo schrieb:
Und solange ich nur sowas mache:
sResP[p] = P;Klappt das auch einfach und ich sehe es dann in der Map.
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...
-
was ist ex? wie ist dein MultivariateDingsda definiert?
Das sieht aus als ob der Zugriff auf variables irgendwo danebenhaut.
-
Bist du sicher, dass der Fehler bei der Map liegt und nicht in " Q.mul(factor_p)"?
Ersetze doch mal
sResP[q] = Q.mul(factor_p);durch
MultivariatePolynomial<monomialOrdering> xyz = Q.mul(factor_p); sResP[q] = = xyz;
-
einen Debugger dranzuhängen sollte auch genau zeigen, wo der Zugriffsfehler passiert...
-
Oke, danke! Der Debugger hilft, denn er weißt auf ganz merkwürdige Fehler hin:
cout << p.degree(x) << endl; cout << p.diff(x).degree(x) << endl; map<int, MultivariatePolynomial<ex_is_lesseq_deggrlex> > m = MultivariatePolynomialFactory::signedSubresultant(p, p.diff(x), x);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.
Innerhalb der Methode signedSubresultant, wenn ich mit dem Debugger darein gehe, haben die Variables p und q aber beide den Wert 4

Ich benutze exakt den gleichen Funktionsaufruf .degree(...). Was ist das los?
-
Könnten wir eventuell mal sehen, was sich genau hinter p und x verbirgt?
-
CStoll schrieb:
Könnten wir eventuell mal sehen, was sich genau hinter p und x verbirgt?
Klar, sorry das ist alles so viel Code ich will euch nur nicht überfluten

GiNaC::symbol x("x"); MultivariatePolynomial<ex_is_lesseq_deggrlex> p( 8 * x * x * y * -2 * y * y * y + 5, l);MultivariatePolynomial<...> 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.
http://www.ginac.de/reference/classGiNaC_1_1symbol.html <- symbol
http://www.ginac.de/reference/classGiNaC_1_1ex.html <- ex
-
Autsch! degree() wertet nach der falschen Variable aus
