Forum: PC-Programmierung MFC_SDI


von Ben (Gast)


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

von Dirk Schnitzler (Gast)


Lesenswert?

Was meinst du mit "ohne Zeiger"?
Kannst du ein bisschen mehr vom Kontext schreiben? Wie sieht z.B. diese
Funktion "Add" aus? Was benutzt du zum Debuggen?

Gruß, Dirk.

von Ben (Gast)


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ß

von Dirk Schnitzler (Gast)


Lesenswert?

Ich habe leider keine Ahnung von der MFC. Aber wahrscheinlich musst du
erst Speicher für dein Array allokieren. Probier mal
"daten.SetSize(123);"

HTH, Dirk.

von Karl heinz B. (heinzi)


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.

von Ben (Gast)


Lesenswert?

vielen Dank, es war mein Fehler!
 habe vergessen Speicher für mein Array zu reservieren!!
 MausDaten=new CArray<CPoint,CPoint>();

von Karl heinz B. (heinzi)


Lesenswert?

Ich kenn zwar Dein Program nicht, aber
ich frage mich, wozu das gut sein soll.
Wie gesagt: ein CArray waechst dynamisch, je nach Anforderung.
Das kannst Du auch statisch anlegen und sparst Dir den
ganzen Hack-Mack mit dynamischer Allokierung

von Lamy (Gast)


Lesenswert?

Du Hast schon Recht, statisch ist ziemlich einfacher, aber der Vorteil
von Zeiger ist daß man Speicher beeinsprucht erst zur Laufzeit!!

von Karl heinz B. (heinzi)


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 :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.