Debug Assertion Failed in dbgheap.c
-
Hallo Leute,
schreibe grad ne OpenGL-Anwendung mit C++/CLI und WindowsForms.
Klappt alles wunderbar. In dem Programm werden Dreiecksnetze verarbeitet und ich wollte mir etwas Arbeit ersparen, indem ich die OpenMesh-Library der RWTH Aachen eingebunden habe (www.openmesh.org). Diese stellt eine brauchbare Datenstruktur für Polygonnetze zur Verfügung (Half-Edge).Jetzt bekomme ich aber, sobald ich das Programm starte, folgende Fehlermeldung:
http://i120.photobucket.com/albums/o176/blue5teel/Fehler.jpgIm Aufruf-Stack ist eine Codezeile einer Klasse der OpenMesh-Bibliothek beteiligt (stlwriter.cc):
_STLWriter_ __STLWriterInstance; //diese Zeile ist beteiligt _STLWriter_& STLWriter() { return __STLWriterInstance; }
Was aber hier das Problem ist weiss ich nicht.
Kann es an der "mixed code"-Geschichte liegen ?Danke
Blue
-
Sehe grad, dass ich vorher noch folgende Warnung bekomme:
1>OpenMeshCored.lib(STLWriter.obj) : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
Sieht sehr stark nach der Ursache des Problems aus...
Muss jetzt nur herausfinden wo und warum ich das '/INCREMENTAL:NO' spezifiziert habe.
-
Naja, die Sache mit der Warnung wars nicht.
Hab die OpenMesh-library mit veränderten Voraussetzungen neu kompiliert.
Und zwar habe ich die folgende Eigenschaft in den Einstellungen des Projekts(C++->General)Debug Information Format : Program Database for Edit & Continue (/ZI)
geädert in :
Debug Information Format : Disabled
Jetzt bekomm ich zwar nicht mehr die Warnung aus dem zweiten Post.
Der "Assertion Failed"-Fehler kommt aber immernoch.
-
Stell es bitte auf "Program database" ein... und wenn der Fehler auftritt drücke auf "Wiederholen" und debugge den Fehler...
-
Jochen Kalmbach schrieb:
Stell es bitte auf "Program database" ein... und wenn der Fehler auftritt drücke auf "Wiederholen" und debugge den Fehler...
Danke Jochen,
aber das hat mir auch nicht geholfen.
Ich habe es jetzt einfach mal mit nem früheren Release der Library versucht.
Habe sie kompiliert und eingebunden.Wenn ich jetzt mein eigenes Projekt kompiliere bekomme ich sehr viele Fehlermeldungen.
Neben unzähligen anderen sind es folgende:1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(413) : warning C4003: not enough actual parameters for macro 'max' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(421) : warning C4003: not enough actual parameters for macro 'min' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(452) : warning C4003: not enough actual parameters for macro 'min' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(457) : warning C4003: not enough actual parameters for macro 'max' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(413) : error C2059: syntax error : '<L_TYPE_raw>' 1> c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(499) : see reference to class template instantiation 'OpenMesh::VectorT<Scalar,N>' being compiled 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(413) : error C2334: unexpected token(s) preceding ':'; skipping apparent function body 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(418) : error C2143: syntax error : missing ')' before '}' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(418) : error C2143: syntax error : missing '}' before ')' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(418) : error C2059: syntax error : ')' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(418) : error C2143: syntax error : missing ';' before '}' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(418) : error C2238: unexpected token(s) preceding ';' 1>c:\dokumente und einstellungen\projects\openglforms\openmesh\core\geometry\VectorT_inc.hh(421) : error C2143: syntax error : missing ';' before 'inline'
Ich kann mir auch vorstellen woran es liegen könnte:
In der Klasse VectorT_inc.hh findet unter anderem folgende Definition statt:inline Scalar max() const { Scalar m(Base::values_[0]); for(int i=1; i<DIM; ++i) if(Base::values_[i]>m) m=Base::values_[i]; return m; }
In einer anderen Header-Datei basis.h, die ich in meinem Programm verwende um Eigenwerte zu berechnen, findet man folgende Codezeilen:
#define min(a, b) (((a) < (b)) ? (a) : (b)) /*.IX{min}*/ #define max(a, b) (((a) > (b)) ? (a) : (b))
Könnte es sein, dass sich durch den beschriebenen Sachverhalt Mehrdeutikeiten in mein Programm eingeschlichen haben ? Wenn ja, wie kann ich sie beseitigen ?
Danke
Blue
-
Das erzeugt keine Mehrdeutigkeiten - der Präprozessor zerlegt dir "nur" die Methodendefinition, indem der versucht, das max-Makro aufzulösen. Die Lösung lautet, die min/max-Makros durch inline-Funktionen zu ersetzen:
template<typename T> inline T min(const T&a,const T& b) { return a<b ? a : b; } template<typename T> inline T max(const T&a,const T& b) { return a>b ? a : b; }
(wo sie gebraucht werden, funktionieren diese Funktionen genauso gut (wenn nicht noch besser) wie die Makros - und sie stören die Definition deiner Methode überhaupt nicht)
-
Habe jetzt einfach vor der Definition von max() in VectorT_inc.hh
inline Scalar max() const { Scalar m(Base::values_[0]); for(int i=1; i<DIM; ++i) if(Base::values_[i]>m) m=Base::values_[i]; return m; }
nachfolgendes eingefügt
#undef min #undef max
Jetzt bekomme ich keine Fehler mehr.
Diese Makros min und max fanden sowieso keine Verwendung. Wie gesagt, auch diese basis.h ist nicht von mir geschrieben, sondern aus dem Internet. Ursprünglich wurde sie in einem größeren Zusammenhang verwendet. Ich brauchte aber nur die Eigenwertberechnungsfunktionalität des größeren Zusammenhangs und diese setzte den Header "basis.h" voraus.
Naja dann schau ich mal ob das denn noch alles funktioniert.
Bekomme jetzt wenigstens keine Fehler mehr.
DankeBlue