Problem beim Zugriff aufs Doc



  • Hallo Leute,

    ich möchte von meinem View aus aufs Doc zugreifen und habe da auch diesen Artikel gefunden, wo beschrieben steht wie`s geht. http://www.c-plusplus.net/forum/viewtopic-var-t-is-125623.html
    Bei mir kommt aber bei dem ASSERT eine Fehlermeldung (ohne nähere Infos).
    Ich denke es hat etwas mit der Initialisierung der Variablen im Doc zu tun, so könnt ihr mal schauen, ob ich da was falsch gemacht hab (MFC-MDI)?
    Ich habe im doc.h eine Klasse als Datensatz angelegt und das als Feld Y in der doc Klasse deklariert.
    Initialisiert im Konstruktor von Doc hab ich es so:

    CMyDoc::CMyDoc()
    : m_NumLines(0)			
    , m_ShownDS(0)		//Allgemeine Daten fürs Doc
    , DScount(0)
    {
    	// TODO: Hier Code für One-Time-Konstruktion einfügen
    
    	//int n,i,k;	Zählvariablen sind in doc.h deklariert deklarieren
    
    for(n=0;n<512;n++){
    	Y[n].MeasType		=0;
    	strcpy_s(Y[n].strMeasType,"    ");
    	Y[n].MeasDate		=0;
    	strcpy_s(Y[n].strMeasDate,"    ");
    	Y[n].FWeg[2]=0;			//MaxPulses=3
    	for(i=0;i<3;i++){
    		Y[n].Lines[i].Count;
    		...		//Gekürzt um zeilen zu sparen
    	}
    
    	}
    
    }
    

    Schaue ich beim überwachen von der View über pDoc in die Variablenwerte werden aber vor dem Fehler schon Werte von DScount angezeigt, die ziemlich groß sind, dabei sollten die doch "frisch" sein. Bei den Werten aus dem Datensatz ist gar keine Initialisierung zu erkennen. es steht beim Überwachen drinn "Ausdruck kann nicht ausgewertet werden".
    Ist die Initiierung des Datensatzes Y so wie oben sinnvoll(-los)?

    Micha



  • der_micha1981 schrieb:

    Bei mir kommt aber bei dem ASSERT eine Fehlermeldung (ohne nähere Infos).
    Ich denke es hat etwas mit der Initialisierung der Variablen im Doc zu tun[...]

    Nein, es ist vielmehr das Casten fehlgeschlagen und der Zeiger ist ungültig. Mit deinen Variablen hat das nichts zu tun. 🙂

    Zeig mal den Code mit dem ASSERT.



  • edit: mir ist gerade aufgefallen, das die Fehlerursache woanders liegt:
    in einer Funktion der View schreibe ich die Zeilen:

    CZFGScrollDoc *pDoc;
    pDoc = dynamic_cast<CZFGScrollDoc*>(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument()); 
    ASSERT(pDoc);
    

    Lasse ich das ASSERT weg, kommt bei dem ersten Zugriff auf eine Doc-Variable die Meldung "Unbehandelte Ausnahme bei 0x00420535 in My.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x006396fc."

    Micha



  • der_micha1981 schrieb:

    Lasse ich das ASSERT weg, kommt bei dem ersten Zugriff auf eine Doc-Variable die Meldung "Unbehandelte Ausnahme bei 0x00420535 in My.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x006396fc."

    Micha

    BITTE schau in die MSDN was ASSERT ist.
    Hast du mein Posting eigentlich gelesen? (Immerhin ist der Code ja schon mal da. In welcher Funktion steht das?)



  • Das man durch das weglassen von ASSERT ein Problem löst hätte ich auch nicht erwartet, nur das man dann vieleicht auf den Fehler schließen könnte. Und ich muss gestehen, ich habe nur deinen ersten Beitrag gelesen. Ich hab dann auch für MDI die richtige Methode gefunden:
    einfach nur
    pDoc = GetDocument();
    reicht bei MDI scheinbar aus().
    Jetzt läuft es. Danke für den Hinweis

    ->schöne Übersicht bei Codeguru:
    http://www.codeguru.com/forum/showthread.php?t=281430


  • Mod

    der_micha1981 schrieb:

    edit: mir ist gerade aufgefallen, das die Fehlerursache woanders liegt:
    in einer Funktion der View schreibe ich die Zeilen:

    CZFGScrollDoc *pDoc;
    pDoc = dynamic_cast<CZFGScrollDoc*>(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument()); 
    ASSERT(pDoc);
    

    Diese Zeilen machen im View doch gar keinen Sinn!
    Ein View hat immer eine Funktion GetDocument mit der man an das zugehörige Doc kommt. Das ist doch gerade das Grundfeature der Doc/View Architektur!



  • Martin Richter schrieb:

    Diese Zeilen machen im View doch gar keinen Sinn!
    Ein View hat immer eine Funktion GetDocument mit der man an das zugehörige Doc kommt. Das ist doch gerade das Grundfeature der Doc/View Architektur!

    Du hast Recht. allerdings hätte ich gedacht, dass es trotzdem funktioniert. Es wäre interessant, warum es nicht geht.

    Ich habe gleich mal geschaut, ich habe die korrekte Version auch in dem Artikel stehen, allerdings werde ich mal ergänzen, dass es NUR so aus dem View geht und nicht "auch so".

    Die Codeguru-Seite ist übrigens in dem Artikel weiter unten in den Antworten auch verlinkt. Also immer schon zu Ende lesen. 🙂


  • Mod

    Zu dem Zeitpunkt zu dem Du dies ausführst heißt es doch gar nicht, dass Dein View auch der aktive View ist...

    Das muss nicht funktionieren.



  • Martin Richter schrieb:

    Zu dem Zeitpunkt zu dem Du dies ausführst heißt es doch gar nicht, dass Dein View auch der aktive View ist...

    Das muss nicht funktionieren.

    Okay, dann ist es also ein MDI Problem und kein allgemeines?
    Mein Artikel ist ja extra für SDI - das heißt die Stelle kann bleiben wie sie ist. 😕


Anmelden zum Antworten