Anuncios Google

Problema con mapas en C++

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?



Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de joserc87

String.

Supongo que sabrás que si quieres comparar dos cadenas char* tienes que comparar elemento a elemento. En otras palabras:

char txt[50] = "HOLA";
txt != "HOLA" // Son diferentes punteros

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.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Almamu

¿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...


Imagen de joserc87

Es con minúsculas.

Tanto el include como la clase son con minúsculas. Además, tienes que usar el namespace std:

#include <string>
 
using namespace std;
 
int main (){
  string a = "hola";
 
}


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Almamu

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.


Imagen de joserc87

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.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.