www.mikrocontroller.net

Forum: PC-Programmierung C++: Klasse nicht richtig initialisiert?


Autor: michael (Gast)
Datum:

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

Autor: yalu (Gast)
Datum:

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

Autor: michael (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich denn sonst noch eine Variable mit übergeben?
wenn ich "&ProcessVideo(NULL, m_pTracker)" schreibe, dann kommt der 
fehler "'&' erwartet L-Wert".

Autor: michael (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

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.