Saludos
Estoy escribiendo una funcion para leer templates desde un archivo y regresarlos por referencia pero tengo problemas al usarlo posteriormente ya que esta mas alla del scope y el apuntador se pierde.
Que tecnica podria utilizar para solucionarlo de manera elegante
Gracias
static char *CargarTemplate (char *filename)
{
FILE *stream;
char buffer[MAX_STRING];
int numread;
char *datos;
/*Abrir Archivo en solo lectura y modo texto*/
/*Leer Archivo*/
/*Cerrar Archivo */
/*Eliminar los caracteres adicionales*/
//Regresar cadena que contienes la informacion del template
//data=szTemplates;
//fscanf( stream, "%s", buffer );
datos=strtok (buffer,"Ì");
return datos;
}
bool ParseXFile(char *FileName)
{
IDirectXFile *pDXFile=NULL;
IDirectXFileEnumObject *pDXEnum=NULL;
IDirectXFileData *pDXData=NULL;
char *datos;
HRESULT hr;
//Creacion del Objeto .X
if (FAILED(DirectXFileCreate(&pDXFile)))
return FALSE;
//Extraer datos desde un archivo templarizado
datos=CargarTemplate ("actionmap.txt");
if (FAILED( pDXFile->RegisterTemplates(datos, strlen(datos))))
{
///////////////////////////////////////////////////////////////
Aqui se pierde la referencia
//////////////////////////////////////////////////////////////
pDXFile->Release();
pDXFile=NULL;
return FALSE;
}
en la función CargarTemplate devuelves un static char*, pero el buffer es dinámico, por eso se destruye al salir de la función.
Prueba a poner algo así:
static char *CargarTemplate (char *filename)
{
FILE *stream;
static char buffer[MAX_STRING];
un saludo
Gracias por la respuesta :D
Habia estado buscando y encontre una solucion como esta aunque no me parece que sea lo mas indicado.
La declaracion del buffer como statica funciona, pero no creo que sea un metodo muy elegante para resolver este problema ya que esta variable se mantendria consumiendo memoria aunque no sea muy grande, pero en fin, no creo que sea una buena practica.
Bueno mi pregunta es :existe otra forma de realizar la misma tarea
sin la utilizacion de varibles estaticas de esta forma.
Gracias de antemano
Claro, lo de la variable static para devolver una cadena no es 'elegante'. Lo que se suele hacer es meterle el buffer a rellenar como parámetro de entrada, declarandolo en la función donde lo vayas a usar:
void CargarTemplate (char *filename, char *datos)
{
char buffer[MAX_STRING];
...
strcpy(datos,strtok (buffer,"Ì"));
}
bool ParseXFile(char *FileName)
{
char datos[MAX_STRING];
...
CargarTemplate("actionmap.txt",datos);
...
}
un saludo