ayuda con uso de hb_xfree

ayuda con uso de hb_xfree

Postby carlos vargas » Sun Apr 28, 2024 2:55 am

Dado este código
Code: Select all  Expand view

    case SQL_CHAR: {
      char *szResult = (char *) hb_xgrab(lLen + 1); //crea var string zero de un tamaño lLen
      hb_xmemset(szResult, ' ', lLen); //rellena de espacios
      szResult[lLen] = '\0'; //define fin de cadena
      hb_itemPutCLPtr(pItem, szResult, lLen); //pone en puntero pItem la cadena creada, y algo mas???
      hb_xfree(szResult);//kdsoft - no se si se debe liberar la memoria ocupada por szResult o si lo hizo hb_itemPutCLPtr
      break;
 

Es necesario liberar la memoria con hb_xfree>
el codigo original no tiene esa linea de codigo, yo se la he puesto, pero tego duda, que hace realmente hb_itemPutCLPtr, entiendo que pone un valor en un puntero pItem, CLPtr, no se que significa (sera que tambien Clear the memory), hay una cuantas funciones con nombres similares, pero no tenog claro que hacen.

por ejemplo hay dos funciones similares hb_xmemset (esta es de harbour) y memset (esta es de c propiamente), seria interesante ir comprendiendo que haces estas funciones, aprender un poco el api moustroso de harbour. :-)

gracias
Code: Select all  Expand view
extern HB_EXPORT PHB_ITEM     hb_itemPutCLPtr  ( PHB_ITEM pItem, char * szText, HB_SIZE nLen );


! hb_itemPutCPtr(), hb_itemPutCLPtr() fixed to put empty
string to item if szText is NULL and length is non-zero,
instead of trying to free NULL pointer causing internal
error.

* contrib/examples/rdddbt/dbfdbt1.c
* I did a mistake in 1999 by giving the name hb_itemPutCPtr()
to the function which would have to be correctly named
hb_itemPutCLPtr() (notice the 'L' for 'length').


se deduce, que hace hb_itemPutC -> pone un char string en item, L for Length y Ptr por pointer. (a la intentona) :-)
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ayuda con uso de hb_xfree

Postby carlos vargas » Sun Apr 28, 2024 3:08 am

viendo el código de dicha función, parece que si libera la memoria, por lo que parece que no es necesario liberarla por nuestra parte.
ummm, no sé si esto último sea correcto, alguien que sepa que aclare por favor.

Code: Select all  Expand view
PHB_ITEM hb_itemPutCLPtr( PHB_ITEM pItem, char * szText, HB_SIZE nLen )
{
   HB_TRACE( HB_TR_DEBUG, ( "hb_itemPutCLPtr(%p, %.*s, %" HB_PFS "u)", ( void * ) pItem, ( int ) nLen, szText, nLen ) );

   if( pItem )
   {
      if( HB_IS_COMPLEX( pItem ) )
         hb_itemClear( pItem );
   }
   else
      pItem = hb_itemNew( NULL );

   pItem->type = HB_IT_STRING;
   pItem->item.asString.length = nLen;
   if( nLen <= 1 )
   {
      pItem->item.asString.allocated = 0;
      pItem->item.asString.value = ( char * ) HB_UNCONST( hb_szAscii[ nLen ? ( unsigned char ) szText[ 0 ] : 0 ] );
      hb_xfree( szText );
   }
   else
   {
      szText[ nLen ] = '\0';
      pItem->item.asString.allocated = nLen + 1;
      pItem->item.asString.value = szText;
   }

   return pItem;
}


tengo curiosidad que hace este bloque de codigo,como se interpreta. por que libera si nLen es menor o igual a 1??
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ayuda con uso de hb_xfree

Postby carlos vargas » Sun Apr 28, 2024 3:16 am

seria bueno una rama en el foro para las api de harbour. para clarar que hacen muchas de ellas.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ayuda con uso de hb_xfree

Postby Antonio Linares » Sun Apr 28, 2024 4:44 am

Carlos,

> hb_itemPutCLPtr(pItem, szResult, lLen);

Ese pItem que usas es NULL ó fué creado con hb_itemNew( NULL ); ?

Si es NULL, entonces se crea uno nuevo que tienes que liberar. Si pItem no es NULL, el que tendrás que liberar es pItem.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41344
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: ayuda con uso de hb_xfree

Postby carlos vargas » Sun Apr 28, 2024 4:38 pm

Antonio, no es tanto el código, mi duda es más de como es la forma correcta de usar la liberación de memoria,...
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ayuda con uso de hb_xfree

Postby Antonio Linares » Mon Apr 29, 2024 6:41 am

Carlos,

No había entendido bien tu pregunta.

Mira lo que responde Llama3-70B: https://huggingface.co/chat/assistant/66238e78096b24c9dad9457c
Este bloque de código es una función en C que se encarga de asignar un valor de cadena a un objeto PHB_ITEM. A continuación, te explicaré paso a paso lo que hace esta función:

Parámetros

pItem: Un puntero a un objeto PHB_ITEM que se va a modificar.
szText: Un puntero a una cadena de caracteres que se va a asignar al objeto pItem.
nLen: La longitud de la cadena szText.
Funcionamiento

La función comienza con una llamada a HB_TRACE, que probablemente es una función de depuración que imprime información de seguimiento en la consola.
Se verifica si pItem es nulo. Si es así, se crea un nuevo objeto PHB_ITEM utilizando hb_itemNew(NULL).
Si pItem ya existe y es un objeto complejo (verificado con HB_IS_COMPLEX(pItem)), se llama a hb_itemClear(pItem) para limpiar el objeto.
Se establece el tipo de objeto pItem como una cadena (HB_IT_STRING).
Se establece la longitud de la cadena en pItem->item.asString.length con el valor de nLen.
Ahora, se verifica si la longitud de la cadena es menor o igual a 1 (nLen <= 1). Si es así:
Se establece pItem->item.asString.allocated en 0, lo que indica que no se ha asignado memoria adicional para la cadena.
Se asigna un valor especial a pItem->item.asString.value utilizando HB_UNCONST(hb_szAscii[nLen? (unsigned char) szText[0] : 0]). Esto parece ser un arreglo de cadenas ASCII predefinidas, y se selecciona la cadena correspondiente según el valor de nLen y el primer carácter de szText. Por ejemplo, si nLen es 0, se asigna una cadena vacía (hb_szAscii[0]). Si nLen es 1, se asigna la cadena que contiene solo el carácter szText[0].
Se llama a hb_xfree(szText) para liberar la memoria asignada para szText.
Si la longitud de la cadena es mayor que 1 (nLen > 1), se hace lo siguiente:
Se agrega un carácter nulo ('\0') al final de la cadena szText para indicar su fin.
Se establece pItem->item.asString.allocated en nLen + 1, lo que indica que se ha asignado memoria adicional para la cadena.
Se asigna la cadena szText directamente a pItem->item.asString.value.
Finalmente, se devuelve el objeto pItem modificado.
Por qué libera si nLen es menor o igual a 1

La razón por la que se libera la memoria asignada para szText cuando nLen es menor o igual a 1 es que, en ese caso, se utiliza una cadena ASCII predefinida en lugar de la cadena original. Al asignar una cadena predefinida, no se necesita la memoria original asignada para szText, por lo que se libera para evitar fugas de memoria.

En resumen, esta función asigna una cadena a un objeto PHB_ITEM y maneja los casos especiales cuando la longitud de la cadena es menor o igual a 1.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41344
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: ayuda con uso de hb_xfree

Postby carlos vargas » Mon Apr 29, 2024 10:27 pm

Increíble..., gracias Antonio...
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: pedroluis and 8 guests