Was für die ::Hyper.Experten...Am verzweifeln :-(
-
Hallo ich bin echt ratlos...ich hab in meinem Code irgend wo (hab schon ne Ahnung wo -zm. in etwa-) n' Fehler (Speicherverletzung: "Access Violation", laut debugger)...und kann ihn nicht finden... Der der ihn findet bekommt und virtuelle Gummipunke

Aber mal ehrlich, wär echt klasse wenn ihr mir helfen könntet...

Hier also mein Code-Ausschnitt...wenn ihr noch mehr braucht einfach melden...

Die Klasse:
CAppData.hclass CAppData { /* -----------------------------------------------------------------------------*/ private: /* -Declarations */ /* -----------------------------------------------------------------------------*/ struct IPlayback /* << Wiedergabeoptionen */ { bool fPaused; /* Wiedergabe pausiert ? */ bool fInit; /* Mediendatei geladen ? */ bool fLocalMute; /* lokale Lautstärke gemutet ? */ bool fGlobalMute; /* globale Lautstärke gemutet ? */ unsigned int uiLocalVol; /* lokaler Lautstärke Wert */ unsigned int uiGlobalVol; /* globaler Lautstärke Wert */ bool fRepeat; /* Wiederholen (Repeat-Mode) ? */ ERepeatModes rpRepMode; /* Wiederholungsmodus (ENUM) */ /* ------- Sicherung: fLocalMute, uiLocalVol, fRepeat, rpRepMode ----------*/ bool fSaved; /* bereits in Datei gespeichert */ SDataSetPos dspDSetPos; /* Position dieses Datensatzes */ }; struct IOptions /* << Programmoptionen */ { struct IStartup /* << Programmstart-Einstellungen */ { bool fAutoStart; /* beim Systemstart laden ? */ bool fStartMin; /* Programm miniert starten ? */ string strKeyName; /* Name des Registry-Eintrags */ string strKeyPath; /* Registry-Wert (Pfad) von strKeyName */ /* ------- Sicherung: Alle ----------*/ bool fSaved; /* bereits in Datei gespeichert */ SDataSetPos dspDSetPos; /* Position dieses Datensatzes */ }; // [> TODO: Weitere Optionen implementieren }; struct IInterface /* << Fenstereinstellungen */ { bool fPrstPaused; /* Trackinformationscontrol pausiert ? */ bool fTopmostWnd; /* Hauptfenster immer im Vordergrund ? */ /* ------- Sicherung: Alle ----------*/ bool fSaved; /* bereits in Datei gespeichert */ SDataSetPos dspDSetPos; /* Position dieses Datensatzes */ }; string _strCfgPath; /* Dateipfad zur Konfigurationsdatei */ string _strIdxPath; /* Dateipfad zur Indexdatei */ bool _fDataSetsSaved; /* Alle Datensätze gespeichert ? */ bool _fCfgFileCreated; /* Konfigurationsdatei bereits erstellt */ bool _fIdxFileCreated; /* Indexdatei bereits erstellt */ // [> TODO: Weiteres... /* -----------------------------------------------------------------------------*/ public: /* -Declarations */ /* -----------------------------------------------------------------------------*/ CAppData (void); ~CAppData (void); /************************************************************************\ ** ** CAppData-Methoden: ** */ bool WriteToFile (long lFileVer); /* Ändert den Speicherpfad zur Konfigurationsdatei */ void SetConfigPath (const string& strPath); /* Ändert den Speicherpfad zur Indexdatei */ void SetIndexPath (const string& strPath); /* Ermittelt den Speicherpfad zur Konfigurationsdatei */ const string& GetConfigPath (void); /* Ermittelt den Speicherpfad zur Indexdatei */ const string& GetIndexPath (void); // ...Hier folgen noch weitere Get und Set Methoden...Hier n paar defs:
ClassDefs.h#ifndef TEXT #ifdef UNICODE #define TEXT(quote) L##quote #else #define TEXT(quote) quote #endif // UNICODE #endif // TEXT #define NO_TEXT (TEXT("")) typedef enum { RPM_NO_REPETITION, /* keine Wiederholung */ RPM_SINGLE, /* nur einen Track wiederholen */ RPM_ALL, /* alle Tracks wiederholen */ RPM_SINGLE_NTIMES, /* einen Tracks n-Mal wiederholen */ RPM_ALL_NTIMES, /* alle Tracks n-Mal wiederholen */ RPM_ENSURE_UINT_ENUM = UINT_MAX /* maximal unsigned int, diesen Wert nicht benutzen */ } ERepeatModes; typedef struct { unsigned long ulBegin; /* Anfang des Datensatzes */ unsigned long ulEnd; /* Ende des Datensatzes */ } SDataSetPos;und nun mein Problemkind/Code^^:
CAppData.cpp:bool CAppData::WriteToFile(long lFileVer) { if(this->_strIdxPath.c_str() == NULL || this->_strCfgPath.c_str() == NULL) return (false); fstream fsIdxFile, fsCfgFile; fsIdxFile.open(this->_strIdxPath.c_str(), ios::in | ios::out | ios::trunc | ios::binary); if(!fsIdxFile.is_open()) return (false); fsCfgFile.open(this->_strCfgPath.c_str(), ios::in | ios::out | ios::trunc | ios::binary); if(!fsCfgFile.is_open()) return (false); /* * Dateitags der Konfigurationsdatei (cfgData.gfx): */ const string strFTBeginCfgFile = TEXT("DEF_CFGDATA_GFX"); const string strFTEndCfgFile = TEXT("CFGDATA_GFX_ENDDEF"); const string strFTCfgBlockBegin = TEXT("#DATA_BLOCK_BEGIN#"); const string strFTCfgBlockEnd = TEXT("#DATA_BLOCK_END#"); /* * Dateitags der Indexdatei (idxPos.gfx): */ const string strFTBeginIdxFile = TEXT("DEF_IDXPOS_GFX"); const string strFTEndIdxFile = TEXT("IDXPOS_GFX_ENDDEF"); const string strFTIdxBlockBegin = TEXT("#DATAPOS_BLOCK_BEGIN#"); const string strFTIdxBlockEnd = TEXT("#DATAPOS_BLOCK_END#"); /* * Datei unabhängig: */ const string strFTFileVersion = TEXT("#FILE_VERSION#"); const string strFTPlaybackBegin = TEXT("#IPLB_BLOCK_BEGIN#"); const string strFTPlaybackEnd = TEXT("#IPLB_BLOCK_END#"); const string strFTInterfaceBegin = TEXT("#IITF_BLOCK_BEGIN#"); const string strFTInterfaceEnd = TEXT("#IITF_BLOCK_END#"); const string strFTStartupBegin = TEXT("#ISTP_BLOCK_BEGIN#"); const string strFTStartupEnd = TEXT("#ISTP_BLOCK_END#"); /* * Erste zu verarbeitende Datei: CfgData.gfx (-> fsCfgFile): */ fsCfgFile.write(strFTBeginCfgFile.c_str(), strFTBeginCfgFile.length()); // TAG: DEF_CFGDATA_GFX fsCfgFile.write(strFTFileVersion.c_str(), strFTFileVersion.length()); // TAG: #FILE_VERSION# // Dateiversion schreiben: fsCfgFile.write((char*)&lFileVer, sizeof(long)); // Version: lFileVer fsCfgFile.write(strFTCfgBlockBegin.c_str(), strFTCfgBlockBegin.length()); // TAG: #DATA_BLOCK_BEGIN# fsCfgFile.write(strFTPlaybackBegin.c_str(), strFTPlaybackBegin.length()); // TAG: #IPLB_BLOCK_BEGIN# // Playback-Interface-Daten schreiben: this->IPlayback::dspDSetPos.ulBegin = static_cast<unsigned long>(fsCfgFile.tellp()); // 1. fLocalMute (bool): fsCfgFile.write((char*)&(this->IPlayback::fLocalMute), sizeof(bool)); // fLocalMute: bool // 2. fRepeat (bool): fsCfgFile.write((char*)&(this->IPlayback::fRepeat), sizeof(bool)); // fRepeat: bool // 3. rpRepMode (ERepeatModes): fsCfgFile.write((char*)&(this->IPlayback::rpRepMode), sizeof(ERepeatModes)); // rpRepMode: ERepeatModes // 4. uiLocalVol (unsigned int): fsCfgFile.write((char*)&(this->IPlayback::uiLocalVol), sizeof(unsigned int)); // uiLocalVol: unsigned int if(!fsCfgFile.fail()) this->IPlayback::dspDSetPos.ulEnd = static_cast<unsigned long>(fsCfgFile.tellp()); fsCfgFile.write(strFTPlaybackEnd.c_str(), strFTPlaybackEnd.length()); // TAG: #IPLB_BLOCK_END# fsCfgFile.write(strFTInterfaceBegin.c_str(), strFTInterfaceBegin.length()); // TAG: #IITF_BLOCK_BEGIN# // (Programm-)Interface-Interface-Daten schreiben: this->IInterface::dspDSetPos.ulBegin = fsCfgFile.tellp(); // 1. fPrstPaused (bool): fsCfgFile.write((char*)&(this->IInterface::fPrstPaused), sizeof(bool)); // fPrstPaused: bool // 2. fTopmostWnd (bool): fsCfgFile.write((char*)&(this->IInterface::fTopmostWnd), sizeof(bool)); // fTopmostWnd: bool this->IInterface::dspDSetPos.ulEnd = static_cast<unsigned long>(fsCfgFile.tellp()); fsCfgFile.write(strFTInterfaceEnd.c_str(), strFTInterfaceEnd.length()); // TAG: #IITF_BLOCK_END# fsCfgFile.write(strFTStartupBegin.c_str(), strFTStartupBegin.length()); // TAG: #ISTP_BLOCK_BEGIN# // Startup-Interface-Daten schreiben: this->IOptions::IStartup::dspDSetPos.ulBegin = static_cast<unsigned long>(fsCfgFile.tellp()); // 1. fAutoStart (bool): fsCfgFile.write((char*)&(this->IOptions::IStartup::fAutoStart), sizeof(bool)); // fAutoStart: bool // 2. fStartMin (bool): fsCfgFile.write((char*)&(this->IOptions::IStartup::fStartMin), sizeof(bool)); // fStartMin: bool this->IOptions::IStartup::dspDSetPos.ulEnd = static_cast<unsigned long>(fsCfgFile.tellp()); fsCfgFile.write(strFTStartupEnd.c_str(), strFTStartupEnd.length()); // TAG: #ISTP_BLOCK_END# fsCfgFile.write(strFTCfgBlockEnd.c_str(), strFTCfgBlockEnd.length()); // TAG: #DATA_BLOCK_END# fsCfgFile.write(strFTEndCfgFile.c_str(), strFTEndCfgFile.length()); // TAG: CFGDATA_GFX_ENDDEF fsCfgFile.close(); // TODO: Index Datei schreiben... fsIdxFile.close(); return (true); }tja und so rufe ich auf(also Test):
main.cpp:static CAppData cAppData; cAppData.SetIndexPath("C:\\idxPos.gfx"); cAppData.SetConfigPath("C:\\cfgData.gfx"); cAppData.WriteToFile(1015); // version 1015Ich sagen schonmal vielen vielen Dank, wär echt super lieb, wenn sich das mal einer angucken könnte....

-
Expertensucher schrieb:
Hallo ich bin echt ratlos...ich hab in meinem Code irgend wo (hab schon ne Ahnung wo -zm. in etwa-) n' Fehler (Speicherverletzung: "Access Violation", laut debugger)...und kann ihn nicht finden... Der der ihn findet bekommt und virtuelle Gummipunke

Was ist ne Gummipunke? Punkte oder Puppe?
Aber ich eigentlich will ich beides nicht. 
Wenn du den Debugger richtig benutzt solltest du doch schnell rausfinden wo, einfach mal Schritt für Schritt durchgehen.
-
hmm der debugger ja...
-
Bitte geben Sie einen Ben schrieb:
Expertensucher schrieb:
Hallo ich bin echt ratlos...ich hab in meinem Code irgend wo (hab schon ne Ahnung wo -zm. in etwa-) n' Fehler (Speicherverletzung: "Access Violation", laut debugger)...und kann ihn nicht finden... Der der ihn findet bekommt und virtuelle Gummipunke

Was ist ne Gummipunke? Punkte oder Puppe?
Aber ich eigentlich will ich beides nicht. 
Wenn du den Debugger richtig benutzt solltest du doch schnell rausfinden wo, einfach mal Schritt für Schritt durchgehen.
hmm LOL, jo mein natürlich GummipunkTe...
also der Debugger führt mich zu einer Datei XSTRINGhier mal der Ausschnitt:
void _Freeze() {if (_Ptr != 0 && _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN) _Grow(_Len); if (_Ptr != 0) _Refcnt(_Ptr) = _FROZEN; } bool _Grow(size_type _N, bool _Trim = false) {if (max_size() < _N) _Xlen(); if (_Ptr != 0 && _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN) if (_N == 0) {--_Refcnt(_Ptr), _Tidy(); return (false); } else {_Copy(_N); return (true); } if (_N == 0) {if (_Trim) _Tidy(true); else if (_Ptr != 0) _Eos(0); return (false); } else {if (_Trim && (_MIN_SIZE < _Res || _Res < _N)) {_Tidy(true); _Copy(_N); } else if (!_Trim && _Res < _N) _Copy(_N); return (true); }} static const _E * __cdecl _Nullstr() {static const _E _C = _E(0); return (&_C); } static size_type _Pdif(const_pointer _P2, const_pointer _P1) {return (_P2 == 0 ? 0 : _P2 - _P1); } static const_pointer _Psum(const_pointer _P, size_type _N) {return (_P == 0 ? 0 : _P + _N); } static pointer _Psum(pointer _P, size_type _N) {return (_P == 0 ? 0 : _P + _N); } unsigned char& _Refcnt(const _E *_U) {return (((unsigned char *)_U)[-1]); } void _Split() {if (_Ptr != 0 && _Refcnt(_Ptr) != 0 && _Refcnt(_Ptr) != _FROZEN) {_E *_Temp = _Ptr; _Tidy(true); assign(_Temp); }} void _Tidy(bool _Built = false) {if (!_Built || _Ptr == 0) ; else if (_Refcnt(_Ptr) == 0 || _Refcnt(_Ptr) == _FROZEN) // hier markiert der Debugger den Code mit einem gelben Pfeil allocator.deallocate(_Ptr - 1, _Res + 2); else --_Refcnt(_Ptr); _Ptr = 0, _Len = 0, _Res = 0; } _E *_Ptr; size_type _Len, _Res; }; template<class _E, class _Tr, class _A> const basic_string<_E, _Tr, _A>::size_type basic_string<_E, _Tr, _A>::npos = -1; #ifdef _DLL #pragma warning(disable:4231) /* the extern before template is a non-standard extension */Ich habe echt nicht die geringste Idee was das soll *am verzweifeln sei*

-
Dann mach halt mal einen Backtrace und schau in welcher deiner Programmzeilen das ist.
-
.filmor schrieb:
Dann mach halt mal einen Backtrace und schau in welcher deiner Programmzeilen das ist.
Huh?!, Was ist denn ein Backtrace...bzw. wie setz ich den ?...danke erstmal für deine Antwort!

-
Siehst du in deinem Debugger keinen Call-Stack!? Dann müstest du eigentlich sehen, welche Zeile in deinen Dateien den Fehlerhaften Aufruf erzeugt!?
Greetz, Swordfish
-
also wenn mit Call Stack die Aufrufliste gemeint ist, dann markiert mir der Compiler folgendes (in der besagten Aufrufliste):
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(unsigned char 1) line 590 + 19 bytes
PS: DAnke für Unterstützung!

-
main()
funktion()
unterfunktion() <- Hier schauen, wo in deinem Code der Fehler auftritt.
LIB-funktion1()
LIB-funktion2()
-
Hi, danke erstmal...
Wie komme ich denn dahin ?PS: Hab MV C++ 6.0
-
Es gibt da links unten (bei mir) ein Fenster mit ner Combobox "Kontext", in der steht der aktuelle Funktionsname, einfach aufklappen und klicken.
-
hm, danke...habs: da steht:
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(unsigned char 1) line 590 + 19 bytes
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() line 59 + 39 bytes
CAppData::~CAppData() line 84 + 26 bytes
$E26() + 34 bytes
doexit(int 0, int 0, int 0) line 353
exit(int 0) line 279 + 13 bytes
mainCRTStartup() line 212
KERNEL32! 7c816d4f()ABer emmm: was heißt das jez ?
-
Das heißt, dass der CAppData Destruktor der Bösewicht ist. Zeig den mal her.
-
Jo kein Problem...nur der ist sehr...simple^^:
CAppData::~CAppData(void) { // --> [none] }
-
Kannst du mir noch helfen....bitte!!

-
Wenn du dort nichts eingetragen hast, ist der Destruktor noch lange nicht "leer"
- von dort aus werden noch die D'toren der Class-Elemente aufgerufen. Und offenbar hast du in deiner Arbeit einen der beiden Strings zerschossen.
-
Hi,
Wie kann man den einen Strng 'zerschießen' ? ...Hab ich das irg wo gemacht (siehe erstes CodePosting) ?
und Danke für deine Antwort!
-
du könntest im destruktor einen breakpoint setzen und dir dort den zustand des objekts anzeigen lassen. das wäre dann unmittelbar vor der absturzstelle. aus dem zustand des objekts kann man dann möglicherweise auf die fehlerursache schließen.
-
this->IPlayback::dspDSetPos.ulBegin = static_cast<unsigned long>(fsCfgFile.tellp());Bist du sicher, daß so etwas durch den Compiler kommt? Du hast dort ein paar struct's definiert, aber ich sehe nirgends ein Objekt von Typ "IPlayBack". (und selbst wenn diese Zeile durch den Compiler kommt, sieht sie extrem ungesund aus)
-
dass der compiler das annimmt, ist allerdings verwunderlich. IPlayback::dspDSetPos ist kein member von CAppData. es stellt sich sowieso die frage, welche mögliche bedeutung das haben sollte.