9

It's my first time trying out C++ STL. I'm trying to build a multidimensional associative array using map. For example:

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

When compiling the code above in VS2005, I got 170 of C4503 warnings. All of the warnings are about "decorated name length exceeded, name was truncated". The program seems to run fine though.

Anyone care to spare some time to explain to me what caused these warnings and how do i solve em? thanks in advance :)

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
agf
  • 148,965
  • 36
  • 267
  • 227
justin
  • 233
  • 2
  • 6
  • 15
  • 1
    May I suggest that you use a `boost::shared_ptr` instead of a raw pointer for storing your `*DA` ? Otherwise, freeing all the allocated memory is likely to become a nightmare. – ereOn Oct 22 '10 at 07:40
  • Hi ereOn, thanks for your suggestion. I'll need to study this more. My program is actually an exe called by a main exe.In the program, a whole bunch(probably thousands) of *DA will be allocated first, then as the program runs some will be freed and allocated dynamically depending on the control commands from the main exe. – justin Oct 22 '10 at 10:44

4 Answers4

8

I'm not a fan of disabling the warning, because per my research, there could be unintended consequences resulting from this warning, so I prefer to truly dispense of the issue.

Here's how I would rewrite the 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;
};   

and you could use it like this:

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

My concerns and ultimate solution primarily derive from MSDN.

krsteeve
  • 1,796
  • 4
  • 19
  • 29
Nick Ligerakis
  • 181
  • 3
  • 6
7

If you intend to keep this monster of a data structure, there is little you can do about the warning other than disable it:

#pragma warning(disable:4503)
Benjamin Lindley
  • 95,516
  • 8
  • 172
  • 256
  • 1
    hi PigBen, thanks for your answer. I had to use some multidimensional associative to store my data, something like what PHP arrays can do. Are there other alternatives that you can suggest me to have a look? – justin Oct 22 '10 at 07:22
  • 1
    @justin: yep: describe your data in another question and ask how you should represent it in C++. – jalf Oct 26 '10 at 10:45
5

Others have suggested how you could disable the warning. I suggest that you rethink your design instead. Use some more abstraction than map^5. Or change the data structure of the storage. E.g. use map instead of map^5.

Updated:

What I mean is that you basically have two options:

  • You use a key with as many strings/levels as you need:

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

  • Or you build something generic, where each level can hold either the DA* value and/or another level.

wilx
  • 16,767
  • 5
  • 53
  • 109
  • Hi wilx, thanks for the advise. I was rethinking how i could minimize the number of maps. The best i could end up with is map^2. What are the disadvantages of having the data structure such as above, map^5? I need at least 2 levels of data association for iteration purposes. What do you think is a better approach to this? – justin Oct 25 '10 at 01:15
  • Note: in the struct you need to define operator< as std::map requires this to be present for the data type used as the map key. – user2746401 Sep 02 '16 at 09:52
-3

Declare in such way( pay attention to finished quotes)

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

C++ recognizes >> as shift operator.

StNickolay
  • 840
  • 2
  • 9
  • 17