Estoy teniendo problemas para usar los mapas en C++. El problema es que al tratar de cojer el valor que hay asigando a una clave en el mapa, me devuelve nulo.
class TextInfo { public: TextInfo(); ~TextInfo(); bool LoadFile( const char* file ); const char* GetText( const char* key ); protected: std::map<const char*, const char*> _data; }; bool TextInfo::LoadFile( const char* file ) { FILE* fp = fopen( file, "rb+" ); if( fp == NULL ) return false; char str[ 256 ]; // Leemos el archivo while( fgets( str, 256, fp ) != NULL) { printf( "Line: %s\n", str ); if( ( strncmp( str, "#", 1 ) == 0 ) || ( strlen( str ) <= 1 ) ) // Si se detecta un comentario paso de el continue; char key[ 48 ], value[ 208 ]; sscanf( str, "%s %[^\n]s", key, value ); printf( "Key: %s, Value: %s\n", key, value ); _data.insert( std::pair<const char*, const char*>( key, value ) ); } fclose( fp ); return true; } const char* TextInfo::GetText( const char* key ) { return _data.find( key )->second; }
Esa clase la uso como "contenedor" para las cadenas de texto que tengo en un archivo. El archivo de texto es el siguiente:
# This file should not be modified # TEXTNAME, "Text in-game" BMW BMW M3 START Press Start M9 9m Silenced
El caso es que todo se lee bien y parece incluirse bien en el mapa de datos, pero cuando quiero cojer el valor asignado a una clave me devuelve siempre nulo:
_gfx->GetFont( 0 )->WriteText( _txt->GetText( "START" ), 11, 11 );
¿Alguna idea de que hago mal? ¿Algo relacionado con la memoria?
String.
Supongo que sabrás que si quieres comparar dos cadenas char* tienes que comparar elemento a elemento. En otras palabras:
El Map lo que hace es comparar los 2 tipos de datos, que en tu caso son punteros, y como los punteros son diferentes, pues no encuentra el item.
Para ahorrarte dolores de cabeza, utiliza la clase string en lugar de char*.
De hecho, si te llegase a encontrar un item, petaría, porque en
_data.insert( std::pair<const char*, const char*>( key, value ) );
le estas añadiendo al Map un puntero a una zona de memoria del Stack que se elimina al salir de la función. En todo caso tendrías que añadir un vector dinámico, en lugar de uno estático. (creado con un new char [X]). Aunque si optas por usar string, no te hace falta.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
¿En que include está la clase
¿En que include está la clase String?
He incluido el archivo String pero me dice que la clase String no existe al tratar usarla...
Es con minúsculas.
Tanto el include como la clase son con minúsculas. Además, tienes que usar el namespace std:
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Oh, esque con el devkit que
Oh, esque con el devkit que use para PC se ponia en mayuscula.
EDIT: Aún usandolo así no me sale. Estoy usando devkitPro para nds.
Pues entonces ya no se.
Yo de devkitPro no se nada. Mira que la extensión sea .cpp en lugar de .c para que se compile con el compilador de c++. Sino, pregunta en el foro de nds.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.