Domanda

E 'la mia prima volta provare C ++ STL. Sto cercando di costruire un array associativo multidimensionale usando la mappa. Ad esempio:

typedef struct DA {
    string  read_mode;
    string  data_type;
    void    *pValue;
    void    *pVarMemLoc;
}DA;

int main()
{
    map<string, map<string, map<string, map<string, map<string, DA*>>>>> DATA;

    DATA["lvl1"]["stg1"]["flr1"]["dep1"]["rom1"] = new DA;
    DATA["lvl1"]["stg1"]["flr1"]["dep1"]["rom2"] = new DA;
    DATA["lvl1"]["stg1"]["flr1"]["dep1"]["rom3"] = new DA;

    IEC["lvl1"]["stg1"]["flr1"]["dep1"]["rom1"]->read_mode = "file";
    IEC["lvl1"]["stg1"]["flr1"]["dep1"]["rom2"]->read_mode = "poll";
    IEC["lvl1"]["stg1"]["flr1"]["dep1"]["rom3"]->read_mode = "report";

    return 0;
}

Quando si compila il codice di cui sopra in VS2005, ho ottenuto 170 di avvisi C4503. Tutte le avvertenze sono circa "decorato lunghezza del nome superata, il nome è stato troncato". Il programma sembra funzionare benissimo comunque.

Chiunque si preoccupa di risparmiare un po 'di tempo per spiegare a me che cosa ha causato questi avvertimenti e come posso risolvere em? grazie in anticipo:)

Warning 1   warning C4503: 'std::map<_Kty,_Ty>::~map' : decorated name length exceeded, name was truncated  c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 2   warning C4503: 'std::map<_Kty,_Ty>::map' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 3   warning C4503: 'std::map<_Kty,_Ty>::operator []' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 4   warning C4503: 'std::_Tree<_Traits>::~_Tree' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 5   warning C4503: 'std::map<_Kty,_Ty>::operator []' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 6   warning C4503: 'std::_Tree<_Traits>::iterator::~iterator' : decorated name length exceeded, name was truncated  c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
Warning 7   warning C4503: 'std::_Tree<_Traits>::iterator::iterator' : decorated name length exceeded, name was truncated   c:\program files\microsoft visual studio 8\vc\atlmfc\include\cstringt.h 2121
È stato utile?

Soluzione

Se avete intenzione di mantenere questo mostro di una struttura di dati, c'è poco che si possa fare l'avvertimento diverso disabilitarlo:

#pragma warning(disable:4503)

Altri suggerimenti

Io non sono un fan di disattivare l'avviso, in quanto per la mia ricerca, ci potrebbero essere conseguenze non intenzionali derivanti da questo avvertimento, quindi preferisco veramente erogazione del problema.

Ecco come vorrei riscrivere il codice:

typedef struct DA {
    string  read_mode;
    string  data_type;
    void    *pValue;
    void    *pVarMemLoc;
}DA;
struct ROOM{
    map<string, DA*> map;
};
struct DEPARTMENT{
    map<string, ROOM> map;
};
struct FLOOR{
    map<string, DEPARTMENT> map;
};
struct STAGE{
    map<string, FLOOR> map;
};   
struct LEVEL{
    map<string, STAGE> map;
};   

e si può usare in questo modo:

int main()
{
    LEVEL DATA;

    DATA.map["lvl1"].map["stg1"].map["flr1"].map["dep1"].map["rom1"] = new DA;
    DATA.map["lvl1"].map["stg1"].map["flr1"].map["dep1"].map["rom2"] = new DA;
    DATA.map["lvl1"].map["stg1"].map["flr1"].map["dep1"].map["rom3"] = new DA;

    ...
    etc

Le mie preoccupazioni e soluzione definitiva derivano principalmente dalle MSDN .

Altri hanno suggerito come si potrebbe disattivare l'avviso. Vi suggerisco di ripensare il vostro disegno, invece. Utilizzare un po 'di astrazione di mappa ^ 5. O modificare la struttura dei dati del magazzino. Per esempio. uso mappa invece di mappa ^ 5.

Aggiornamento:

Quello che voglio dire è che, fondamentalmente, sono due opzioni:

  • È possibile utilizzare una chiave con il maggior numero di stringhe / livelli di cui hai bisogno:

    struct Key3 { std::string x, y, z; }; typedef std::map<Key3, DA*> MyMap;

  • In alternativa si costruisce qualcosa di generico, in cui ogni livello può contenere sia il DA * valore e / o un altro livello.

Declare in modo tale (prestare attenzione con quotazioni finiti)

map<string, map<string, map<string, map<string, map<string, DA*> > > > > DATA;

C ++ riconosce >> come operatore di traslazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top