Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: phoenixtrilogy en 07 de Enero de 2003, 04:35:19 AM

Título: string y paso por referencia
Publicado por: phoenixtrilogy en 07 de Enero de 2003, 04:35:19 AM
                                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;
   }                                
Título: string y paso por referencia
Publicado por: fiero en 07 de Enero de 2003, 12:38:00 PM
                                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                                
Título: string y paso por referencia
Publicado por: phoenixtrilogy en 07 de Enero de 2003, 11:04:42 PM
                                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                                
Título: string y paso por referencia
Publicado por: fiero en 08 de Enero de 2003, 09:27:06 AM
                                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