Question

Il est ma première fois d'essayer la STL de C. Je suis en train de construire un tableau associatif multidimensionnel en utilisant la carte. Par exemple:

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

Lors de la compilation du code ci-dessus dans VS2005, je suis arrivé 170 des avertissements C4503. Toutes les mises en garde sont de « longueur du nom décoré dépassé, le nom a été tronqué ». Le programme semble fonctionner très bien si.

Quelqu'un veut d'épargner un certain temps pour me expliquer ce qui a causé ces avertissements et comment puis-je résoudre em? merci à l'avance:)

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
Était-ce utile?

La solution

Si vous avez l'intention de garder ce monstre d'une structure de données, il y a peu, vous pouvez faire l'avertissement autre que le désactiver:

#pragma warning(disable:4503)

Autres conseils

Je ne suis pas fan de désactiver l'avertissement, parce que par mes recherches, il pourrait y avoir des conséquences non intentionnelles résultant de cet avertissement, donc je préfère vraiment la question de distribution.

Voici comment je réécrire le code:

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

et vous pouvez l'utiliser comme ceci:

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

Mes préoccupations et solution ultime découlent principalement de MSDN .

D'autres ont suggéré comment vous pouvez désactiver l'avertissement. Je suggère que vous repensez à la place de votre conception. Utilisez un peu plus abstraction que la carte ^ 5. Ou changer la structure de données de stockage. Par exemple. utiliser la carte au lieu de carte ^ 5.

Mise à jour:

Qu'est-ce que je veux dire est que vous avez essentiellement deux options:

  • Vous utilisez une clé avec autant de chaînes / niveaux que vous avez besoin:

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

  • Ou vous construisez quelque chose de générique, où chaque niveau peut contenir soit la DA * valeur et / ou un autre niveau.

Declare de telle manière (attention à des citations finis)

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

C ++ reconnaît >> comme opérateur de décalage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top