2010-10-22 21 views
8

Es la primera vez que pruebo C++ STL. Estoy tratando de construir una matriz asociativa multidimensional utilizando el mapa. Por ejemplo:C4503 advertencias? ¿Cómo los soluciono/me deshago de ellos?

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 se refieren a "la longitud del nombre decorado excedida, el nombre fue truncado". Sin embargo, el programa parece funcionar bien.

¿Alguien quiere dedicar algo de tiempo para explicarme qué causó estas advertencias y cómo las soluciono? 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 
+1

¿Puedo sugerirle que use un 'boost :: shared_ptr' en lugar de un puntero sin formato para almacenar su' * DA'? De lo contrario, es probable que liberar toda la memoria asignada se convierta en una pesadilla. – ereOn

+0

Hola, gracias por su sugerencia. Tendré que estudiar esto más. Mi programa es en realidad un exe llamado por un exe principal. En el programa, se asignará un grupo completo (probablemente miles) de * DA, luego, cuando el programa se ejecute, algunos se liberarán y asignarán dinámicamente dependiendo de los comandos de control del exe principal – justin

+1

Tantos mapas. D: – GManNickG

Respuesta

7

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

#pragma warning(disable:4503) 
+1

hola PigBen, gracias por su respuesta. Tuve que usar un asociativo multidimensional para almacenar mis datos, algo así como lo que las matrices PHP pueden hacer. ¿Hay otras alternativas que me sugieras que eche un vistazo? – justin

+1

@justin: sí: describe tus datos en otra pregunta y pregunta cómo debes representarlos en C++. – jalf

+0

Gracias jalf, lo haré :) – justin

-3

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.

+8

Solucionado en C++ 0x. –

+4

Ese no es el problema (MSVC ya lo analiza como lo hizo el OP) – jalf

5

Otros han sugerido cómo podría deshabilitar la advertencia. Sugiero que reconsidere su diseño en su lugar. Usa algo más de abstracción que map^5. O cambie la estructura de datos del almacenamiento. P.ej. use el mapa en lugar del 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 usted construye d algo genérico, donde cada nivel puede contener el valor DA * y/u otro nivel.

+0

Hola wilx, gracias por el consejo. Estaba reconsiderando cómo podría minimizar la cantidad de mapas. Lo mejor que podría terminar es el mapa^2. ¿Cuáles son las desventajas de tener la estructura de datos como la anterior, map^5? Necesito al menos 2 niveles de asociación de datos para fines de iteración. ¿Cuál crees que es un mejor enfoque para esto? – justin

+0

Nota: en la estructura debe definir operator <, ya que std :: map requiere que esto esté presente para el tipo de datos utilizado como la clave del mapa. – user2746401

7

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, por lo que prefieren prescindir de verdad 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.

+2

Las consecuencias se escriben aquí: http://msdn.microsoft.com/en-us/library/074af4b6.aspx –

+0

Si desea evitar el uso de ".map" en todas partes, puede usar la herencia en su lugar: 'ROOM de la clase: mapa público {} ', etc. –

Cuestiones relacionadas