2010-10-22 10 views
8

È la prima volta che provo C++ STL. Sto cercando di costruire un array associativo multidimensionale usando la mappa. Per esempio:avvisi C4503? Come posso risolvere/sbarazzarmi di loro?

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 avuto 170 di avvisi C4503. Tutti gli avvisi riguardano la "lunghezza del nome decorata superata, il nome è stato troncato". Il programma sembra funzionare bene.

Qualcuno si preoccupa di dedicare un po 'di tempo a spiegarmi che cosa ha causato questi avvertimenti e come risolvo 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 
+1

Posso suggerire di utilizzare un 'boost :: shared_ptr' invece di un puntatore raw per la memorizzazione di' * DA'? Altrimenti, liberare tutta la memoria allocata diventerà probabilmente un incubo. – ereOn

+0

Ciao, grazie per il tuo suggerimento. Avrò bisogno di studiare di più. Il mio programma è in realtà un exe chiamato da un exe principale. Nel programma, un intero gruppo (probabilmente migliaia) di * DA verrà assegnato per primo, quindi mentre il programma viene eseguito alcuni verranno liberati e allocati dinamicamente a seconda dei comandi di controllo dal principale exe. – justin

+1

Così tante mappe. D: – GManNickG

risposta

7

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) 
+1

Ciao PigBen, grazie per la tua risposta. Ho dovuto utilizzare alcune associazioni multidimensionali per archiviare i miei dati, qualcosa di simile a ciò che gli array PHP possono fare. Ci sono altre alternative che mi puoi suggerire di dare un'occhiata? – justin

+1

@justin: sì: descrivi i tuoi dati in un'altra domanda e chiedi come dovresti rappresentarlo in C++. – jalf

+0

grazie jalf, lo farò :) – justin

-3

Declare in modo tale (prestare attenzione alle citazioni finiti)

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

C++ riconosce >> come operatore di turno.

+8

Risolto in C++ 0x. –

+4

Questo non è il problema (MSVC lo analizza già come l'OP intendeva) – jalf

5

Altri hanno suggerito come disattivare l'avviso. Ti suggerisco di ripensare il tuo design. Usa un po 'più di astrazione di map^5. O modificare la struttura dei dati della memoria. Per esempio. usa la mappa invece della mappa^5.

Aggiornato:

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

  • Si utilizza 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;

  • Oppure si compra d qualcosa di generico, in cui ogni livello può contenere il valore DA * e/o un altro livello.

+0

Ciao wilx, grazie per il consiglio. Stavo ripensando a come avrei potuto minimizzare il numero di mappe. Il meglio che potrei ottenere è map^2. Quali sono gli svantaggi di avere la struttura dati come sopra, mappa^5? Ho bisogno di almeno 2 livelli di associazione dati per scopi di iterazione. Quale pensi sia un approccio migliore a questo? – justin

+0

Nota: nella struttura è necessario definire l'operatore user2746401

7

io non sono un fan di disabilitazione l'avvertimento, perché per la mia ricerca, ci potrebbero essere conseguenze non intenzionali derivanti da questo avvertimento, quindi preferisco erogare veramente 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 poteva 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 dalla MSDN.

+2

sono scritte qui: http://msdn.microsoft.com/en-us/library/074af4b6.aspx –

+0

Se si desidera evitare l'uso di ".map" ovunque, è possibile utilizzare l'ereditarietà invece: 'class ROOM: public map {} ', ecc. –

Problemi correlati