Access violation bei zuweisung einer Member Variablen



  • 😕 Ich hab mit dieser Member nicht einen Zeiger!
    Hier mal alles was mit der Member zusammenhängt:

    wavealyzeDoc.cpp(434): m_lAnzahlSamples = temp;
    wavealyzeDoc.cpp(435): return m_lAnzahlSamples;
    wavealyzeDoc.cpp(456): long* pData = new long [m_lAnzahlSamples];
    wavealyzeDoc.cpp(460): QuickSort(pData,m_lAnzahlSamples,TRUE);
    wavealyzeDoc.cpp(579):/* long* pData = new long [m_lAnzahlSamples];
    wavealyzeDoc.cpp(594):/* long* pData = new long [m_lAnzahlSamples];
    wavealyzeDoc.cpp(631):/* long* pData = new long [m_lAnzahlSamples];
    wavealyzeDoc.cpp(651):/* long* pData = new long [m_lAnzahlSamples];
    wavealyzeDoc.cpp(674): long* pData = new long [m_lAnzahlSamples];
    wavealyzeDoc.h(38): long m_lAnzahlSamples;

    Was davon passt nicht?



  • Polofreak schrieb:

    😕 Ich hab mit dieser Member nicht einen Zeiger!

    Aber du hast vermutlich einen Zeiger auf die Klasse, die diesen Member enthält. Wenn du über diesen Zeiger eine Methode aufrufst, die auf den Member zugreift, knallt's.



  • wavealyzeView.cpp(187): m_nAnzSamples = m_pDocument->getAnzahlSamples(m_Wavefile);
    wavealyzeView.cpp(190): m_pDocument->getCalculatedInfo(m_Wavefile, Ergebnisse);

    Die zwei Funktionen greifen auf die Doc Klasse in welcher auch die Member deklariert ist.



  • vc++ hat doch einen schönen debugger. starte den und er breakt an der stelle, an der der zugriff misslingt.



  • ja er breaked an der Stelle wo ich ne 0815 Zuweisung mache!

    unsigned long CWavealyzeDoc::getAnzahlSamples(fstream Wavefile)
    {// Länge DataChunksize / Blockalign
    temp = getDataChunkSize(Wavefile) / getBlockAlign(Wavefile);
    m_lAnzahlSamples = temp; //hier breaked er!!! ACCESS VIOLATION
    	return m_lAnzahlSamples;
    }
    


  • Polofreak schrieb:

    ja er breaked an der Stelle wo ich ne 0815 Zuweisung mache!

    Und welchen Wert hat m_pDocument, wenn da getAnzahlSamples aufgerufen wird (oder auch, welchen Wert hat this an dieser Stelle)?



  • this = 0x012447c8

    m_pDocument = 0xcdcdcdcd 😮

    Zufall? Nein! Da scheint dort was schief zu gehen, aber wo genau?

    Ich habe mir die m_pDocument selbst angelegt in meiner View header habe ich gemacht:

    CWavealyzeDoc* m_pDocument;

    wie komme ich aber sonst an diese variable denn es wird ja schon

    CWavealyzeDoc* CWavealyzeView::GetDocument() // non-debug version is inline
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWavealyzeDoc)));
    	return (CWavealyzeDoc*)m_pDocument;
    }
    

    selbst angelegt, wenn ich dann aber die member verwenden will geht es schief! also hab ich obiges gemacht und es ging alles bisher.



  • Vermutlich rufst du GetDocument auf, bevor überhaupt eine Dokumentinstanz erstellt wurde. Wie sieht denn die Aufrufliste (Callstack) zum Zeitpunkt der AV aus?



  • AV? ArbeitsVorbereitung?

    Ich glaub nicht dass ich die wo falsch aufruf, denn ich hab da gar nichts dran gemacht, ich hab also nur die Aufrufe drin die automatisch rein gekommen sind (Klassenassi)

    Wo soll ich mir jetzt den Callstack anschauen?



  • Polofreak schrieb:

    AV? ArbeitsVorbereitung?

    Access Violation.

    Ich glaub nicht dass ich die wo falsch aufruf,

    Leider sind wir aber hier nicht in der Kirche. Glaube bringt dich nicht weiter 😉

    Wo soll ich mir jetzt den Callstack anschauen?

    Da, wo das Programm abstürzt.



  • AV natürlich tschuldigung, aber es ist noch früh *gg*

    Stimmt in der Kirche sind wir nicht, dachte nur an ne größere Wahrscheinlichkeit des Fehlers an ner anderen Stelle. 😉

    CALL Stack direkt vor dem Absturz:

    CWavealyzeDoc::getAnzahlSamples(fstream {...}) line 431
    CWavealyzeView::FillScreenWithInfo() line 187 + 45 bytes
    CWavealyzeView::OnButton1() line 152
    _AfxDispatchCmdMsg(CCmdTarget * 0x01244810 {CWavealyzeView}, unsigned int 1013, int 0, void (void)* 0x0040106e CWavealyzeView::OnButton1(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 1013, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CView::OnCmdMsg(unsigned int 1013, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 162 + 24 bytes
    CWnd::OnCommand(unsigned int 1013, long 131464) line 2099
    CWnd::OnWndMsg(unsigned int 273, unsigned int 1013, long 131464, long * 0x0012fadc) line 1608 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 1013, long 131464) line 1596 + 30 bytes
    AfxCallWndProc(CWnd * 0x01244810 {CWavealyzeView hWnd=???}, HWND__ * 0x0002018a, unsigned int 273, unsigned int 1013, long 131464) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x0002018a, unsigned int 273, unsigned int 1013, long 131464) line 379
    USER32! 77e2a420()
    USER32! 77e06381()
    USER32! 77e07361()
    USER32! 77e20a23()
    USER32! 77e1e138()
    USER32! 77e2a420()
    USER32! 77e04605()
    USER32! 77e0a7ba()
    USER32! 77e1f49d()
    CWnd::IsDialogMessageA(tagMSG * 0x006061dc {msg=0x00000202 wp=0x00000000 lp=0x00100035}) line 182
    CWnd::PreTranslateInput(tagMSG * 0x006061dc {msg=0x00000202 wp=0x00000000 lp=0x00100035}) line 3435
    CFormView::PreTranslateMessage(tagMSG * 0x006061dc {msg=0x00000202 wp=0x00000000 lp=0x00100035}) line 213
    CWavealyzeView::PreTranslateMessage(tagMSG * 0x006061dc {msg=0x00000202 wp=0x00000000 lp=0x00100035}) line 135
    CWnd::WalkPreTranslateTree(HWND__ * 0x0002019e, tagMSG * 0x006061dc {msg=0x00000202 wp=0x00000000 lp=0x00100035}) line 2678 + 18 bytes
    CWinThread::PreTranslateMessage(tagMSG * 0x006061dc {msg=0x00000202 wp=0x00000000 lp=0x00100035}) line 672 + 18 bytes
    CWinThread::PumpMessage() line 848 + 30 bytes
    CWinThread::Run() line 487 + 11 bytes
    CWinApp::Run() line 400
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00132f9d, int 1) line 49 + 11 bytes
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00132f9d, int 1) line 30
    WinMainCRTStartup() line 198 + 54 bytes
    KERNEL32! 77e9893d()



  • Polofreak schrieb:

    Ich habe mir die m_pDocument selbst angelegt in meiner View header habe ich gemacht:

    CWavealyzeDoc* m_pDocument;

    Du gehst es falsch an. Du sagst du legst eine Variable CWavealyzeDoc* m_pDocument im Header deiner CWavealyzeView an. Das Solltest du nicht machen denn die Baseclass CView von CWavealyzeView hat schon ein protected DataMenber CDocument* m_pDocument.
    Mit deiner declaration überdeckst du nur diese Variable und deine neue Variable wird beim Öffnen eines Dokuments nicht initialisiert.
    Du solltest folgendermassen vorgehen:
    in deiner Methode

    CWavealyzeView::FillScreenWithInfo() {
       CWavealyzeDoc* pDocument = GetDocument(); // GetDocument macht den cast 
       if ( 0 != pDocument ) {
          .....
          pDocument->getAnzahlSamples( fstream .... ); //
          .....                                  // Sanples bearbeiten
       }
    }
    

    Kurt



  • 10 mal 👍 für Kurt!

    Genau das wars!!! JUHUUUUU

    Jetzt tut das wieder sooo schön! genial!

    Vielen Dank euch allen Für eure riesen Bemühungen mit dir.

    @ MFK: scheinbar hab ich den richtigen Glauben 😉 😃


Anmelden zum Antworten