Fehler bei der Implementierung von cRecordingInfo::ChannelID() in VDR?

  • Hi!


    Habe wieder mal eine Frage an die c++-Spezialisten hier.


    Ich habe versucht den Kanal einer Aufzeichnung zu bekommen. Dazu gibt es folgende Deklarationen in VDR:



    Nun wollte ich die ChannelID mit folgendem Code erhalten:

    Code
    const cRecordingInfo *recInfo = myRec->Info();
    tChannelID chID = recInfo->ChannelID();


    Das kompiliert leider nicht, und das hat anscheinend was mit den CONST-Bedingungen zu tun:

    Code
    g++ -fPIC -g -O3 -march=pentium2 -mcpu=pentium3 -fomit-frame-pointer -pipe -Wall -Woverloaded-virtual -O2 -g -c -DHAVE_IMAGEMAGICK -DHAVE_FREETYPE -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"text2skin"' -I/usr/include/freetype2 -I../../../include -I../DVB/linux/include -I../DVB/include -I. -o display.o display.c
    display.c: In member function `virtual cxType
       cText2SkinDisplayMenu::GetTokenData(const txToken&)':
    display.c:1212: error: passing `const cRecordingInfo' as `this' argument of `
       tChannelID cRecordingInfo::ChannelID()' discards qualifiers
    display.c:1213: error: passing `const cRecordingInfo' as `this' argument of `
       tChannelID cRecordingInfo::ChannelID()' discards qualifiers
    make: *** [display.o] Error 1


    Da ich mich da nicht so wirklich auskenne habe ich mal bei Scott Meyers "Effective C++" nachgelesen. Mit folgenden Zeilen funktioniert das ganze dann:

    Code
    cRecordingInfo *recInfo = const_cast<cRecordingInfo*>(mRecording->Info());
    tChannelID chID = recInfo->ChannelID();


    Ist das ein Fehler in den VDR-Deklarationen? Oder gibt es einen Weg die ChannelID ohne einen CAST zu bekommen?


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

    Einmal editiert, zuletzt von Brougs78 ()

  • Zitat

    Original von Brougs78

    Code
    cRecordingInfo *recInfo = myRec->Info();
    tChannelID chID = recInfo->ChannelID();

    Das kompiliert leider nicht, und das hat anscheinend was mit den CONST-Bedingungen zu tun.


    Wie wäre es denn mit:

    Code
    const cRecordingInfo *recInfo = myRec->Info();


    Gruß
    Stefan

  • Hi!


    Sorry, das war ein Fehler oben. Habe das wie stefan.h versucht, dabei kommt die Fehlermeldung oben heraus (habe den ersten Beitrag editiert).


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

  • Zitat

    Original von stefan.h
    Bezieht sich das auf meinen Vorchlag oder das OP?


    Bezieht sich auf die const-Thematik in C++ generell.


    Wenn ich es recht überblicke ist doch das Problem, dass die eine Routine einen const-Zeiger zurückliefert, die andere aber eben nicht const deklariert ist.


    Der Compiler beschwert sich daher, wenn der Programmierer nicht durch enen cast explizit die Verantwortung übernimmt. Das ist der Weg mit dem const_cast, den ich aber für nicht so richtig sauber halte.


    stefan.h hat also die eine Hälfte zur Lösung beigetragen, die andere Hälfte wäre IMHO die Routine ChannelID noch const zu deklarieren:



    Lars

  • Hi!


    Sowas in der Richtung dachte ich mir. Dass man eben die Routine von VDR anders deklarieren sollte.
    Mit anderen Worten, als User der Schnittstelle kann ich es nicht sauberer als mit einem Cast implementieren richtig?
    Dann werde ich Klaus mal darauf ansprechen.


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

  • Hi!


    Habs getestet. Funktioniert einwandfrei. Habe Klaus mal angemailt.


    Gruß,
    Brougs78

    - -- --- ================================================================ --- -- -
    Antec Fusion, Intel E5200, Asus P5N7A-VM (VDPAU), DD CineS2 v6 + DD DuoFlex CI // yavdr-0.6.1
    - -- --- ================================================================ --- -- -

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!