www.mikrocontroller.net

Forum: PC-Programmierung MFC_SDI


Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk Schnitzler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Dirk Schnitzler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ben (Gast)
Datum:

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

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lamy (Gast)
Datum:

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

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.