Container ? Access Violation ? wo denn ?
-
Folgende Nachricht erscheint beim schliessen meines Programmes:
Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException" ist in Key Generator VC++ Version.exe aufgetreten. Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.und gibt mir den link zu xutility
inline void __CLR_OR_THIS_CALL _Container_base_secure::_Orphan_all() const { // orphan all iterators _Lockit _Lock(_LOCK_DEBUG); if (_Myfirstiter != _IGNORE_MYITERLIST) { for (_Iterator_base **_Pnext = (_Iterator_base **)&_Myfirstiter; *_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter) (*_Pnext)->_Mycont = 0; // <- HIER DER PFEIL *(_Iterator_base **)&_Myfirstiter = 0; } }und nun die Fuktion die diesen Fehler auslößt.
Wenn ich sie nicht betätige geht alles gut:float Feld[4]; float combicheck[5]; std::string MINUS[5]; iterates = 1; zeichen = rand()%35; zeichen = zeichen + 1; teiler = 0; Feld[1] = 1; Feld[2] = 1; Feld[3] = 1; Feld[4] = 1; combicheck[3] = 0; while (combicheck[3] != 2) { if (VERSION->Text == "1.0") { combicheck[1] = Feld[1]+Feld[4]-8; combicheck[2] = (Feld[2]+Feld[3])/2+Feld[2]; combicheck[3] = combicheck[2] / combicheck[1]; combicheck[4] = combicheck[1] * combicheck[3]; } else if (VERSION->Text == "1.1") { combicheck[1] = Feld[1]+Feld[4]+8; combicheck[2] = (Feld[2]+Feld[3])/2+Feld[2]-8; combicheck[3] = combicheck[2] / combicheck[1]; combicheck[4] = combicheck[1] * combicheck[3]; } else if (VERSION->Text == "1.2 (=1.1)") { combicheck[1] = Feld[1]+Feld[4]+8; combicheck[2] = (Feld[2]+Feld[3])/2+Feld[2]-8; combicheck[3] = combicheck[2] / combicheck[1]; combicheck[4] = combicheck[1] * combicheck[3]; } else if (VERSION->Text == "1.3") { combicheck[1] = Feld[1]+Feld[4]+16; combicheck[2] = (Feld[2]+Feld[3])/2+((Feld[2]*2)-16)/2; combicheck[3] = combicheck[2] / combicheck[1]; combicheck[4] = combicheck[1] * combicheck[3]; } else { combicheck[1] = Feld[1]+Feld[4]-8; combicheck[2] = (Feld[2]+Feld[3])/2+Feld[2]; combicheck[3] = combicheck[2] / combicheck[1]; combicheck[4] = combicheck[1] * combicheck[3]; } if (combicheck[3] == 2) { MINUS[1] = gesamt.substr(0,8); MINUS[2] = gesamt.substr(8,16); MINUS[3] = gesamt.substr(24,16); MINUS[4] = gesamt.substr(40,8); MINUS[5] = MINUS[1]; MINUS[5] += " - "; MINUS[5] += MINUS[2]; MINUS[5] += " - "; MINUS[5] += MINUS[3]; MINUS[5] += " - "; MINUS[5] += MINUS[4]; KEY->Text = gcnew String(MINUS[5].c_str()); } teiler = 0; wh = 0; gesamt = ""; Feld[1]=0; Feld[2]=0; Feld[3]=0; Feld[4]=0; while (wh < 48) { zeichen = rand()%35; zeichen = zeichen + 1; teiler++; wh++; if (teiler<8) { Feld[1] += zeichen; } if (teiler>8&&teiler<24) { Feld[2] += zeichen; } if (teiler>24&&teiler<40) { Feld[3] += zeichen; } if (teiler>40) { Feld[4] += zeichen; } //...doch ich verstehe nicht ganz wieso das Probleme machen sollte ?
UOPS...
Wenn ich
float Feld[4];
float combicheck[5];
std::string MINUS[5];
iterates = 1;
Global definiere gibt er mir gleich bei der ausführung einen link zu iosfwdstatic _Elem *__CLRCALL_OR_CDECL _Copy_s(_Out_cap_(_Size_in_bytes) _Elem *_First1, size_t _Size_in_bytes, _In_count_(_Count) const _Elem *_First2, size_t _Count) { // copy [_First1, _First1 + _Count) to [_First2, ...) // _DEBUG_POINTER(_First1); // _DEBUG_POINTER(_First2); _CRT_SECURE_MEMCPY(_First1, _Size_in_bytes, _First2, _Count); return _First1; }
-
Auf den ersten Blick float Feld[4]; und x = Feld[4] bzw Feld[4] = x ist nicht gut.
string minus[5] und x = minus[5] bzw minus[5] = x ist nicht gut.
Da wirds passieren.
-
moment, das dürfte doch gar nicht compiliert werden fällt mir grad auf.
bein nem 0-3 Array auf Platz 4 zugreifen wie geht das denn ?
-
Der Compiler merkt das nicht. Ok, bei festen Werten könnte er es vielleicht merken.
Der index Operator macht ja nichts anderes, als einen Adress Offset dazuzuaddieren. Deshalb könntest du auch Feld[100] schreiben.
Das wär nichts anderes als (feld+100sizeof(float)) - also springe 100 float "Einträge" weiter im Speicher.