C++ map - Verständnisproblem :-(

  • Folgender Konflikt: C/C++ Einteiger versucht std::map zu benutzen ;)


    zu den Details:
    ich hätte gerne ein map:
    typedef map<int, char *> cDMap;


    deklariert wird es:
    cDMap datamap;



    Nach meinem Verständnis müsste ich dann doch im Code
    datamap[id] = strdup(value);
    verwenden können ?


    ...


    aus der .h


    innderhalb der processDatabenutze ich dann
    datamap[epgdataid] = strdup(value);


    Was

    Code
    datamap.c: In member function 'void cDataMap::processData(xmlTextReader *)':
    datamap.c:57: error: no match for 'operator=' in '((cDataMap *)this)->cDataMap
        ::datamap. map<int, vector<char *> >::operator[](
            ((const int &)((const int *)(& epgdataid)))
        ) = strdup(((const char *)value))'
    datamap.c: In member function 'char * cDataMap::GetStr(int)':


    und return datamap[dataid]; ergibt.

    Code
    datamap.c:63: error: cannot convert 'vector<char *>' to 'char *' in return


    Warum gräbt er hier nen Vector aus ?

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

  • Hi,


    eigentlich sieht es doch schick aus, kann es sein das dir ein "fremdes" typedef einen Strich durch durch Rechnung macht !? Eventuell hilft es auf "using namespace std;" zu verzichten und stattdessen typedef std::map<int, char *> zu nehmen ...



    $ g++ -o map map.cpp
    $ ./map
    Ok




    BTW: Allerding solltest Du beachten das der strdup kopierte String später auch wieder per free freigegeben wird, sonst gibt es eine nettes Speicherleck.

  • ich vermute einfach mal das der compiler das noatime auf meinen Platten nicht mag ... weil vektor hatte ich da vorher drin - brauch ich aber nicht. Also ein Problem gelöst.


    Die map soll beim instantieren des Objektes aus einer Datei gefüllt werden. Den Dateinamen würde ich gerne übergeben. Damit ich zwei maps haben kann, mit verschiedenen Wertepaaren.



    cDMap *catmap = new cDMap("category.xml");


    ergibt dann:
    main2.c:616: error: No match for 'map<int, char *>::map(const char [13])'


    cDataMap(const char* s) soll dann:
    cDataMap::cDataMap (const char *s)
    {
    datamap.clear();
    read_xml_file((char *)s);
    }


    die map aus der Datei erstellen.

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

  • Kleiner Offtopic-Hinweis: Mit std::string würdest Du Dir das strdup'e und das (potentiell vergessbare) ge'free'e sparen ;)


    EDIT:
    Ich sehe gerade, die Strings sind nicht-konstant. Falls die Arrays nach dem Einlesen geändert werden, vergiss meinen Hinweis.


    EDIT2:
    In dem Fall würde ein gekapseltes Array das strdup'e und ge'free'e sparen.

  • Ein gekapseltes array sagt mir nichts. Muss ich bei Gelegenheit mal googeln.


    Das sind auch meine ersten Gehversuche in C/C++ soweit es meine Zeit zulässt.Ich werde sicher noch einiges überarbeiten, sobald mein Verständnis besser wird. Werden soll es ein Plugin analog zum tvm2vdr Plugin für epgdata.com. Das erste Ziel ist erstmal ein funktionierender standalone Parser.


    http://svn.origo.ethz.ch/wsvn/…vm2vdr/trunk/epgdata2vdr/


    Ansonsten ist das nicht so OT - weil das eigentliche Problem gelöst ist. Und für Verbesserungshinweise oder wenn ich irgendwo totalen Unfug gemacht habe bin ich durchaus dankbar!

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

    Einmal editiert, zuletzt von steffen_b ()

  • wenn Du eine map initalisierst dann doch auch mit den Datentypen
    wie du die map definiert hast: zudem nimm doch bitte gleich nen
    std::string oder willst Du, wenn die map gelöscht werden soll alle Zeiger von hand deleten.


    also



    was nie geht ist


    map *pMap;


    pMap = new std:map<123, "irgendsonstring">
    sondern
    pMap = new std::map<int, std::string>


    Achtung!


    char * str = null;
    std::string(str); -> crash!


    inline char* get_c_String(
    return m_string.c_str();


    )


    Zeiger nur gültig sollange object::m_string existiert und nicht geändert wird!
    genauso
    inline std::string& getStdStringRef(
    return m_string;
    )


    moviemax

    2x TT-C 1501 +1x TT-S2-1600 an Q6600
    1x Reelbox light

    3 Mal editiert, zuletzt von moviemax ()

  • Ah, ich sehe es sind noch weitere C++ Verfechter anwesend :D


    Ein gekapseltes Array wäre z.B. ein std:.vector (variable Größe, also "reallokierbar") oder std::tr1::array (ab gcc 4.2 glaube ich, feste Größe wie []).


    Code
    {
    std::vector<char> puffer(8192);
    char* ptr = &puffer[0];
    
    
    // Mit ptr wie mit einem malloc Array verfahren
    
    
    } // free vergessen :)


    Ganz allgemein nennt sich diese Technik RAII (Google). Man koppelt alles, was freigegeben werden muss, direkt an ein Objekt, welches das Freigeben im Destruktor erledigt. Hat auch den Vorteil, dass es egal ist, ob der Block durch }, return, break, throw oder sonstwie verlassen wird (was man in C oft durch etwas wie das unbeliebte "goto error_exit" gelöst hat).


    EDIT:
    moviemax:

    Zitat


    inline char* get_c_String(
    return m_string.c_str();


    )


    Zeiger nur gültig sollange object::m_string existiert und nicht geändert wird!


    Zudem muss die Rückgabe Zeiger-auf-const sein, da c_str's Rückgabetyp es auch ist. Ein "wegcasten" des const und schreibender Zugriff auf den Speicher ist zudem undefiniert. Für so etwas s.o.

  • Vielen Dank erstmal. Ich versuch mal am WE den Code dahingehend zu verbessern. (Wenn das Wetter nicht zu schön wird).


    Wie gesagt ich bin blutiger Anfänger ;)


    Was das mir sagen soll bin ich mir nicht sicher:


    Mein Part in dem svn ist nur das epgdata2vdr Verzeichnis.


    Ansonsten ist es halt noch viel c&p, schreiben , ausprobieren - also ein Gefühl dafür bekommen :)

    VDR User: 87 - LaScala LC14B - LG/Phillipps 6,4" VGA Display | Asrock H61/U3S3 | G630T | 1x 16GB Mobi Mtron 3035 1x WD 750GB 2,5" |1x L4m DVB-S2 Version 5.4

Jetzt mitmachen!

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