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
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.
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ß
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.
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.
vielen Dank, es war mein Fehler! habe vergessen Speicher für mein Array zu reservieren!! MausDaten=new CArray<CPoint,CPoint>();
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
Du Hast schon Recht, statisch ist ziemlich einfacher, aber der Vorteil von Zeiger ist daß man Speicher beeinsprucht erst zur Laufzeit!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.