| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für NX |
Autor
|
Thema: std::vector / Debug-Modus (3038 mal gelesen)
|
Roland Struck Mitglied
Beiträge: 6 Registriert: 28.08.2008 XP Pro/SP2 Unigraphics NX3.0.5.3 MP1 VisualStudio 2003
|
erstellt am: 28. Aug. 2008 08:17 <-- editieren / zitieren --> Unities abgeben:
Hallo, wenn ich mit NXOpen einen vector erzeuge, z.B. mit std::vector<NXOpen::NXObject *> object_array; und diesen mit Objekten füllen, erhalte ich im Debug-Modus vom Visual Studio folgende Fehleremeldung, wenn der vector aus dem scope geht, also eigentlich automatisch freigegeben werden sollte: Debug Assertion Failed Program: d:\ugs\ugsnx3\ugii\ugraf.exe File: dbgheap.c Expression: _CrtlsValidHeapPointer(pUserData) Gruß Roland
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 28. Aug. 2008 18:27 <-- editieren / zitieren --> Unities abgeben: Nur für Roland Struck
Hallo Roland, als erstes mal willkommen hier im Forum. Als zweites meine Einschätzung, daß bisher keiner Deine Frage überhaupt verstanden hat . Zur Verarbeitung von Vektoren gibt's die Klasse(n) NXOpen.UF.UFvec(2|3|4). Ich vermute aber mal, daß Du unter "Vektor" etwas anderes, evtl. ein Array verstehst ? Gruß, Michael
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
totti2305 Mitglied Dipl Ing Maschinenbau
Beiträge: 183 Registriert: 10.03.2005
|
erstellt am: 30. Aug. 2008 10:02 <-- editieren / zitieren --> Unities abgeben: Nur für Roland Struck
Hallo Roland? Willst du vielleicht anstatt C arrays, C++ vectors benutzen? Wenn ja, mach folgendes Erstmal vector definieren damit du die in ner NX Open Anwendung nutzen kanns #include <vector> Dann, kommt drauf an ob du die vectoren global oder lokal benutzen willst, den typ und den namen definieren zB. vector<NXString> meinVector Vektoren können verschiedene types besitzen, also integer, tag.... Das ganze kannste dann mit C++ Regeln auffüllen, abfragen, löschen usw. Einfach mal im netz stöbern. auf der seite cplusplus findest du eigentlich alle funktionen zu c++ vektoren Torsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Roland Struck Mitglied
Beiträge: 6 Registriert: 28.08.2008 XP Pro/SP2 Unigraphics NX3.0.5.3 MP1 VisualStudio 2003
|
erstellt am: 01. Sep. 2008 10:17 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke für die Antworten. Ich möchte schon die C++-Klasse std::vector benutzen und habe mich an dem Beispiel "Sample NX Open C++ program : report pmi display instance views" auf dem GTAC orientiert, da ich ebenfalls eine manuelle Objektauswahl durch den Anwender benötige. Ich kann mir eigentlich nur vorstellen, dass der Fehler von irgendwelchen Einstellungen im Visual Studio herrührt. @mseufert: Eine Klasse NXOpen.UF.UFvec kann ich in den NXOpen-headern nicht finden. Gibt es die vielleicht in NX3 noch nicht? Gruß Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 01. Sep. 2008 16:29 <-- editieren / zitieren --> Unities abgeben: Nur für Roland Struck
|
Overcast Mitglied
Beiträge: 111 Registriert: 21.12.2005 .
|
erstellt am: 09. Sep. 2008 12:15 <-- editieren / zitieren --> Unities abgeben: Nur für Roland Struck
@Michael: Die Klassen UFVec2 und UFVec3 sind nicht für die Methode NXOpen::Selection::SelectObjects zu gebrauchen. @Roland: Vielleicht macht es Sinn, mal einen minimalen lauffähigen Sourcecode zu posten...? Ist ansonsten recht theoretisch, warum Dein Heap einen Fehler erzeugt. Die Meldung besagt jedenfalls, dass Du in einem ungültigen Speicherbereich rumwuschelst
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Moderator Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2624 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-1980 3D Printer Prusa MK2 S
|
erstellt am: 09. Sep. 2008 14:37 <-- editieren / zitieren --> Unities abgeben: Nur für Roland Struck
|
Roland Struck Mitglied
Beiträge: 6 Registriert: 28.08.2008 XP Pro/SP2 Unigraphics NX3.0.5.3 MP1 VisualStudio 2003
|
erstellt am: 09. Sep. 2008 14:39 <-- editieren / zitieren --> Unities abgeben:
Hallo Overcast, hier ist der code: ////////////////////////////////////////////////////////////////////////
/* Include files */ #if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun ) # include <strstream> # include <iostream> using std: strstream; using std::endl; using std::ends; using std::cerr; #else # include <strstream.h> # include <iostream.h> #endif #include <uf.h> #include <uf_object_types.h> #include <NXOpen/Session.hxx> #include <NXOpen/NXObject.hxx> #include <NXOpen/UI.hxx> #include <NXOpen/Selection.hxx> using namespace NXOpen; using namespace std; /***************************************************************************** ** Activation Methods *****************************************************************************/ /* Explicit Activation ** This entry point is used to activate the application explicitly, as in ** "File->Execute UG/Open->User Function..." */ extern DllExport void ufusr( char *parm, int *returnCode, int rlen ) { /* Initialize the API environment */ Session* THIS_SESSION = NXOpen::Session::GetSession(); try { // ask user to select text UI *ui = UI::GetUI(); Selection *sm = ui->GetSelectionManager(); NXString message("Bitte Texte waehlen:"); NXString title("Bitte Texte waehlen"); Selection::SelectionScope scope = Selection::SelectionScope::SelectionScopeUseDefault; Selection::SelectionAction action = Selection::SelectionAction::SelectionActionClearAndEnableSpecific; bool include_features = 0; bool keep_highlighted = 0; std::vector<Selection::MaskTriple> mask_array; Selection::MaskTriple MT(UF_drafting_entity_type, UF_draft_note_subtype, 0); mask_array.push_back(MT); std::vector<NXObject *> object_array; // Select objects using filter defined by mask triples Selection::Response res = sm->SelectObjects ( message, title, scope, action, include_features, keep_highlighted, mask_array, object_array ); if (object_array.size()) { ; } } /* Handle errors */ catch ( ... ) { ; } } /***************************************************************************** ** Utilities *****************************************************************************/ /* Unload Handler ** This function specifies when to unload your application from Unigraphics. ** If your application registers a callback (from a MenuScript item or a ** User Defined Object for example), this function MUST return ** "UF_UNLOAD_UG_TERMINATE". */ extern "C" DllExport int ufusr_ask_unload() { return (int)NXOpen::Session::LibraryUnloadOptionImmediately; } //////////////////////////////////////////////////////////////////////// Als Bibliotheken habe ich unter "Linker"->"Input"->"Additional Dependencies" folgende: libufun.lib libugopenint.lib libnxopencpp.lib libnxopenuicpp.lib Gruß Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Overcast Mitglied
Beiträge: 111 Registriert: 21.12.2005 .
|
erstellt am: 09. Sep. 2008 16:52 <-- editieren / zitieren --> Unities abgeben: Nur für Roland Struck
Zitat: Original erstellt von mseufert: Hab' ich irgend was anderes behauptet ?
@Michael: Nein, hast Du nicht, aber DoppelMoppel schmecken besser @Roland: Habe Deinen Code mal für NX6 kompiliert. Dafür muss man lediglich Code: ui->GetSelectionManager();
durch Code: ui->SelectionManager();
ersetzen.Linker-Inputs sind die gleichen: libufun.lib libnxopencpp.lib libugopenint.lib libnxopenuicpp.lib Kann aber auch im Debug-Modus erstmal keinen Fehler feststellen. Wann passiert denn der Heap-Fehler genau? Gruß, Frank
[Diese Nachricht wurde von Overcast am 09. Sep. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Roland Struck Mitglied
Beiträge: 6 Registriert: 28.08.2008 XP Pro/SP2 Unigraphics NX3.0.5.3 MP1 VisualStudio 2003
|
erstellt am: 10. Sep. 2008 07:32 <-- editieren / zitieren --> Unities abgeben:
Hallo Overcast, der Fehler tritt auf, wenn der vector aus dem scope geht (nach der schliessenden Klammer des try-Blocks). Dann wird der Destructor des vectors aufgerufen wird. Dieser ruft dann seinerseits einige Funktionen auf, um den Speicher freizugeben. Im Endeffekt wird der Fehler dann in der Datei "dbgdel.cpp" in Funktion "void operator delete(void *pUserData)" ausgelöst. Die Zusicherung "_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))" schlägt fehl. Gruß Roland
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Overcast Mitglied
Beiträge: 111 Registriert: 21.12.2005 .
|
erstellt am: 10. Sep. 2008 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für Roland Struck
Hallo Roland, kann den Fehler leider auch mit NX3 nicht nachvollziehen. Als Command für den Debug-Modus habe ich "C:\...\NX 3.0\UGII\ugraf.exe" angegeben. Dann ein Part mit mehreren (auch mehrzeiligen) Notes im Drafting erzeugt. Nach der Selektion werden alle Texte im Informationsfenster ausgegeben. Code:
#include <uf.h> #include <uf_object_types.h>#include <NXOpen/Annotations.hxx> #include <NXOpen/Annotations_Note.hxx> #include <NXOpen/ListingWindow.hxx> #include <NXOpen/NXException.hxx> #include <NXOpen/NXObject.hxx> #include <NXOpen/Selection.hxx> #include <NXOpen/Session.hxx> #include <NXOpen/UI.hxx> using namespace NXOpen; using namespace std; extern DllExport void ufusr( char *parm, int *returnCode, int rlen ) { /* Initialize the NXOpen C++ environment */ Session* THIS_SESSION = NXOpen::Session::GetSession(); try { UI *ui = UI::GetUI(); Selection *sm = ui->GetSelectionManager(); NXString message("Select Notes:"); NXString title("Select Notes"); Selection::SelectionScope scope = Selection::SelectionScopeUseDefault; Selection::SelectionAction action = Selection::SelectionActionClearAndEnableSpecific; bool include_features = 0; bool keep_highlighted = 0; std::vector<Selection::MaskTriple> mask_array; Selection::MaskTriple MT(UF_drafting_entity_type, UF_draft_note_subtype, 0); mask_array.push_back(MT); std::vector<NXObject *> object_array; // Select objects using filter defined by mask triples Selection::Response res = sm->SelectObjects( message, title, scope, action, include_features, keep_highlighted, mask_array, object_array ); if (object_array.size()) { Annotations::Note *note; std::vector<NXString> messages; std::vector<NXString> texts; for (unsigned int ii = 0; ii < object_array.size(); ii++) { note = dynamic_cast<Annotations::Note *>(object_array[ii]); texts = note->GetText(); for(unsigned int jj=0; jj<texts.size(); jj++) { messages.push_back(texts[jj]); } } ListingWindow *lw = THIS_SESSION->GetListingWindow(); lw->Open(); for (unsigned int kk = 0; kk < messages.size(); kk++) { lw->WriteLine(messages[kk].getText()); } } } /* Handle errors */ catch ( const NXOpen::NXException& ex ) { THIS_SESSION->GetListingWindow()->WriteLine(ex.GetMessage()); } } extern "C" DllExport int ufusr_ask_unload() { return (int)NXOpen::Session::LibraryUnloadOptionImmediately; }
Die Projektoptionen sind wie folgt:
Code:
Compile: /Od /I "c:\ugs\nx 3.0\ugopen" /D "WIN32" /D "_USRDLL" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /Gm /EHsc /RTC1 /MD /Zc:wchar_t /GR /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /ZI /TPLink: /OUT:"Debug/select_notes.dll" /INCREMENTAL /NOLOGO /LIBPATH:"c:\ugs\nx 3.0\ugopen" /DLL /DEBUG /PDB:"Debug/select_notes.pdb" /SUBSYSTEM:CONSOLE /IMPLIB:"Debug/select_notes.lib" /MACHINE:X86 libufun.lib libnxopencpp.lib libugopenint.lib libnxopenuicpp.lib "\ugs\Nx 3.0\Ugopen\libufun.lib" "\ugs\Nx 3.0\Ugopen\libnxopencpp.lib" "\ugs\Nx 3.0\Ugopen\libugopenint.lib" "\ugs\Nx 3.0\Ugopen\libnxopenuicpp.lib"
Gruß, Frank. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Roland Struck Mitglied
Beiträge: 6 Registriert: 28.08.2008 XP Pro/SP2 Unigraphics NX3.0.5.3 MP1 VisualStudio 2003
|
erstellt am: 10. Sep. 2008 14:31 <-- editieren / zitieren --> Unities abgeben:
Hallo Overcast, ich habe mittels Deiner Compileroptionen den Fehler gefunden. Er tritt auf, weil ich im Gegensatz zu Dir als Runtime Library "Multi-threaded Debug DLL" (/MDd) ausgewählt habe (nehem ich /MD ist alles OK). Meines Wissens nach soll man doch für Debug-builds die jeweilige Debug-Version der Runtime Library verwenden. Vielen Dank, Roland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Overcast Mitglied
Beiträge: 111 Registriert: 21.12.2005 .
|
erstellt am: 17. Sep. 2008 14:37 <-- editieren / zitieren --> Unities abgeben: Nur für Roland Struck
|
| Konstrukteur w/m/d | Unsere junge Tochtergesellschaft Aerzen Turbo Europe GmbH, mit Standort im niedersächsischen Hameln, beschäftigt derzeit 14 Mitarbeiter und konzentriert sich auf den Verkauf, Service, Engineering, Montage und die Entwicklung von Turbogebläse-Aggregaten innerhalb der Region Europe, Middle East und Africa (EMEA). JOB-ID 1771 Konstrukteur w/m/d
| Anzeige ansehen | Konstruktion, Visualisierung |
|
Roland Struck Mitglied
Beiträge: 6 Registriert: 28.08.2008 XP Pro/SP2 Unigraphics NX3.0.5.3 MP1 VisualStudio 2003
|
erstellt am: 18. Sep. 2008 06:56 <-- editieren / zitieren --> Unities abgeben:
|