hallo zusammen, ich arbeite mit ms visual studio 2005. dort habe ich eine klasse geschrieben die so aussieht: class CTest { public: CTest(void); ~CTest(void); void test(); int select; } der konstruktor hat nur die initialisierung von select = 0 drin. in meinem hauptprogramm habe ich einen pointer auf die klasse angelegt. im konstruktor des hautprogrammes "erstelle" ich dann die variable mit: m_ptest = new CTest; soweit so (hoffentlich) gut. wenn ich jetzt in meinem hauptprogramm mit m_ptest->test() die funktion aufrufe, dann klappt das auch. aber sobald ich versuche die variable select zu benutzen (sei es schreiben oder lesen), dann bekomme ich einen speicherzugriffsfehler. beim debuggen ist mir aufgefallen, dass im konstruktor von CTest die variable ordnungsgemäß auf 0 gesetzt wird. in der funktion steht aber nur noch müll drin. wahrscheinlich ist das wieder so ein kleiner anfängerfehler, aber ich weiß echt nicht weiter.
Diese Informationen sind etwas vage, um konkret zu sagen zu können wo's hapert. Du must etwas mehr Code posten, am besten ein vollständiges Miniprogramm, das die Klasse, das Hauptprogramm, die Methodenaufrufe und die Membervariablenzugriffe enthält.
header: class CTracker { public: CTracker(void); ~CTracker(void); void Invoke_Tracker(IplImage* image); int select; }; cpp: CTracker::CTracker(void) { select = 0; } void CTracker::Invoke_Tracker(IplImage* image) { if(select == 0) Background(image); if(select == 1) DiffBackground(image); } ___________________________________________________________________ "hauptprogramm" cpp: typedef void (*TMyFunction) ( IplImage*, CTracker*); // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info" void ProcessVideo(IplImage* image, CTracker* tracker) { IplImage* image1 = reinterpret_cast<IplImage*>(image); if(image1 != NULL) tracker->Invoke_Tracker(image1); } CtrackingDlg::CtrackingDlg(CWnd* pParent /*=NULL*/) { ... m_pTracker = new CTracker(); } void CtrackingDlg::OnBnClickedButtonStart() { ... void * ptr = static_cast<void*>(&ProcessVideo); (static_cast<TMyFunction>(ptr))(NULL, m_pTracker); ... cvcamSetProperty(0, CVCAM_PROP_CALLBACK, ptr); ... } hier wird eine callbackmethode in opencv gesetzt, die dann das frame zur verarbeitung weiterreicht. funktioniert auch. bis auf den zugriff auf die variablen. ich würde vermuten, dass der typedef da was verhaut... nur funktioniert der rest....
> void * ptr = static_cast<void*>(&ProcessVideo);
Das ist nicht erlaubt. Denn &ProcessVideo ist ein Funktionszeiger, void*
aber ein Datenzeiger. Du darfst jeden Datenzeiger nach void* casten,
Funktionszeiger aber niemals.
wie kann ich denn sonst noch eine Variable mit übergeben? wenn ich "&ProcessVideo(NULL, m_pTracker)" schreibe, dann kommt der fehler "'&' erwartet L-Wert".
hab gerade nen weg gefunden. ist zwar noch nicht optimal, aber funktioniert. anstatt die m_pTracker zu übergeben, habe ich sie global definiert und kann so auch ausserhalb der klasse (also in ProcessVideo) darauf zugreifen....
> CTracker::CTracker(void) > { > select = 0; > } Stilistisch besser wäre: CTracker::CTracker(void) : select(0) { } > void ProcessVideo(IplImage* image, CTracker* tracker) > { > IplImage* image1 = reinterpret_cast<IplImage*>(image); Wozu glaubst du, den reinterpret_cast zu benötigen? > void * ptr = static_cast<void*>(&ProcessVideo); > (static_cast<TMyFunction>(ptr))(NULL, m_pTracker); Hier nochmal ein nutzloser (und in diesem Fall eben falscher) Cast. > bis auf den zugriff auf die variablen. ich würde vermuten, dass der > typedef da was verhaut... nur funktioniert der rest.... Ich denke, daß du erstmal die ganze Casterei abstellen solltest. > wie kann ich denn sonst noch eine Variable mit übergeben? Wem willst du wo was für eine Variable übergeben? > wenn ich "&ProcessVideo(NULL, m_pTracker)" schreibe, dann kommt der > fehler "'&' erwartet L-Wert". ProcessVideo(NULL, m_pTracker) wäre ja auch ein Aufruf der Funktion. Das & würde in dem Fall die Adresse des Rückgabewertes der Funktion bilden, aber die Funktion gibt nichts zurück, von dem man die Adresse bilden kann. Ich habe keine Ahnung, was du eigentlich erreichen willst. PS: Deine Shift-Taste scheint kaputt zu sein. Zumindest kommen von dir außer im Quellcode die Großbuchstaben nicht an.
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.