Pregunta

Es mi primera vez probar STL C ++. Estoy tratando de construir una matriz asociativa multidimensional en el mapa. Por ejemplo:

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;
}

Al compilar el código anterior en VS2005, tengo 170 de advertencias C4503. Todas las advertencias son acerca de "decorada longitud del nombre superado, el nombre fue truncado". El programa parece funcionar muy bien sin embargo.

A alguien le importa a un poco de tiempo para explicar a mí lo que hizo que estas advertencias y cómo lo resuelvo em? gracias de antemano:)

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
¿Fue útil?

Solución

Si usted tiene la intención de mantener este monstruo de una estructura de datos, es poco lo que puede hacer acerca de la advertencia que no sea desactivarlo:

#pragma warning(disable:4503)

Otros consejos

No soy un fan de la desactivación de la advertencia, porque por mi investigación, podría haber consecuencias no deseadas que resultan de esta advertencia, así que prefiero realmente dispensación de la cuestión.

Así es como me gustaría volver a escribir el código:

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;
};   

y se podía utilizar de esta manera:

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

Mis preocupaciones y solución definitiva derivan principalmente de MSDN .

Otros han sugerido cómo se podría desactivar la advertencia. Sugiero que replantearse el diseño de su lugar. Use un poco más que la abstracción mapa ^ 5. O cambiar la estructura de datos del almacenamiento. P.ej. uso mapa en lugar de un mapa ^ 5.

Actualizado:

Lo que quiero decir es que, básicamente, tiene dos opciones:

  • Se utiliza una clave con el mayor número de secuencias / niveles a medida que necesita:

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

  • O se construye algo genérico, donde cada nivel puede retener la DA * valor y / o otro nivel.

Declarar de tal manera (prestar atención a las cotizaciones terminados)

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

C ++ reconoce >> como operador de desplazamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top