MFC_SDI

Gast #296019
Lesenswert?

HI zusammen,
bei einer MFC Anwendung definiere ich in der Doc.h ein Array wo ich
nachher die angeklickten Punkte speichern kann:
 CArray<CPoint,CPoint> daten;
und in der View.cpp die Funktion OnLButtonDown():
 CDoc* pDoc= GetDocument();
 pDoc->daten->Add(point);
beim Compilieren gibts kein Fehler aber beim Ausführen stürzt alles ab
sobald ich das erste Mal klicke!!!!
Im Debug-Modus zeigt wird ein Fehler bei der Add-Funktion gezeigt!!!!!
wenn ich alles ohne Zeiger mache funktioniert alles richtig!!
Weiß vielleicht jemand wo der der Fehler oben liegt!!
Danke
Gast #296021
Lesenswert?

ohne zeiger meine ich statisch: CPoint array[max_size].
Dann in der OnLButtonDown()
{
....
....
 array[anzahl]=point;
 anzahl++;
}
die "Add" Funktion ist ja in der Klasse "CArray" definiert, ich
brauche die einfach aufzurufen!!!
Debugen!!! ich lasse die Anwendung im Debug-Modus laufen und dann
Schritt für Schritt weiter, (Microsoft Visual Studio 6).

Gruß
#296023
Lesenswert?

CArray funktioniert wie std::vector: Er vergroessert sich
selbstaendig.

@Ben
Da passt was nicht zusammen. Du sagst das Du im CDocument
das Array statisch anlegst.
Warum dann den 2.-ten Pointer in

pDoc->daten->Add(point);

daten ist kein Pointer!

pDoc->daten.Add( point );

Ansonsten:
Wenn Du im Debugger bist, setz Dir einen Breakpoint auf die
Zeile (F9), lasse den Breakpoint auflaufen.
Dan markierst Du mit der Maus das Wort pDoc. Rechte Maustaste
und 'Quick View' auswaehlen. Im Dialog siehst Du den Wert
von pDoc. Sollte nicht NULL sein.
Markiere 'pDoc->daten'. Wieder: Rechte Maustaste, Quick View
und einen Blick auf das daten Member von pDoc werfen.
So findest Du das Problem.

Du musst lernen mit Deinen Werkzeugen umzugehen. VC++ hat einen
ausgezeichneten Debugger.
#296027
Lesenswert?

Aehm. Wir reden von einem CArray Objekt, kontra einem Pointer.
So ein CArray Objekt braucht zwar auch ein paar Bytes aber
so viele sind es dann auch wieder nicht.
Typischerweise ist in dem CArray Objekt drinnen:
  * ein Zaehler (ist glaub ich ein int)
  * ein Pointer
d.h. Du erkaufst dir den Platzgewinn von sizeof(int) durch
 * umstaendlichere Programmierung
 * wenn Du einen Fehler machst, hast Du Speicherlecks
 * siehe oben, beim geringsten Fehler einen Crash, den Du
   erst muehsam suchen musst

Eine Speichereinsparung von genau einem sizeof(int) ist bei
heutigen Desktop Systemen Jacke wie Hose. Dem Windows wird
das wahrscheinlich noch nicht mal auffallen, das rueckt seinen
Speicher sowieso in 4 KByte Einheiten raus.

Die Zeiten wo um jedes Byte gegeizt wurde sind am Desktop-Markt
schon lange vorbei(*). Heute zaehlt: Schnelligkeit und
Zuverlaessigkeit in der Entwicklung. Dort liegen die Kosten begraben,
nicht ob man 64 MB oder 128 MB im Zielrechner voraussetzen kann.

(*) Ausser natuerlich in speziellen Bereichen, wie Kernel oder
Treiber-Programmierung. Aber wer soweit ist, braucht obiges nicht
zu fragen :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren