Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





string y paso por referencia

Iniciado por phoenixtrilogy, 07 de Enero de 2003, 04:35:19 AM

« anterior - próximo »

phoenixtrilogy

                                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;
   }                                

fiero

                                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                                
www.videopanoramas.com Videopanoramas 3D player

phoenixtrilogy

                                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                                

fiero

                                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                                
www.videopanoramas.com Videopanoramas 3D player






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.