Page 1 of 1

Quitar Ceros de la derecha. Error al compilar

Posted: Wed Dec 05, 2007 7:40 pm
by tsales
Antonio

La funcion que te adjunto devuelve la cadena pasada quitando los ceros de la derecha.
Por ejemplo: cQuitaCeros("123.456000"), devuelve "123.456".

Compilada con xHarbour funciona correctamente pero si la compilo con Harbour_CE obtengo el siguiente error de compilación y desconocemos el motivo.
¿Que estoy haciendo mal?
Te agradeceria me lanzaras un cable.

Saludos
Toni Sales
********* ERROR DE COMPILACION *******************
error C2223: left of '->item' must point struct/union

********* LA FUNCION ******************************
#include "hbapi.h"
HB_FUNC ( CQUITACEROS )
{

PHB_ITEM pItem;
char *szText;
int i;
int n;
char * szResult;


pItem = hb_param(1, HB_IT_STRING);

if( pItem )
{
szText = pItem->item.asString.value;
i = (int) pItem->item.asString.length -1 ;
n = 0;

while( i >= 0)
{
if(szText != '0')
{
n = ( n != 0 ? n : i );
}
i--;


}

if( n != 0)
{
szResult = ( char * ) hb_xgrab( n+1 );
memcpy( szResult, szText , n+1);
hb_retclenAdopt( szResult, n+1 );
return;

}


}

hb_ret();
return;

}

Posted: Wed Dec 05, 2007 8:10 pm
by Antonio Linares
Toni,

La estructura HB_ITEM está protegida en Harbour, igual que en Windows usamos un handle (puntero) de ventana, pero no el contenido de lo apuntado por ese handle. Eso aumenta la seguridad y la compatibilidad con _.

Aún así, puedes superar esa barrera de esta forma:

#define _HB_API_INTERNAL_
#include <hbapi.h>

Posted: Wed Dec 05, 2007 8:36 pm
by jlcapel
Antonio,
La estructura HB_ITEM está protegida en Harbour, igual que en Windows usamos un handle (puntero) de ventana, pero no el contenido de lo apuntado por ese handle. Eso aumenta la seguridad y la compatibilidad con _.
Entonces... ¿como debemos tratar los punteros a ITEM de Harbour? ¿Cuales funciones podríamos usar?

Saludos y gracias por tu luz.
José Luis Capel

Posted: Wed Dec 05, 2007 8:43 pm
by Antonio Linares
Jose Luis,

> Entonces... ¿como debemos tratar los punteros a ITEM de Harbour?

Como "handles" (no modificables) y no como punteros :-)

> ¿Cuales funciones podríamos usar?

Depende de lo que querais hacer. En vuestra función es suficiente con usar hb_parc() y hb_retc() :-)

Posted: Wed Dec 05, 2007 9:06 pm
by Antonio Linares
Bueno, tambien han hecho falta hb_parclen() y hb_retclen() :-)

Aqui la teneis funcionando:

Code: Select all

function main()

   MsgInfo( cQuitaCeros( "123.4560000" ) )

return nil

#pragma BEGINDUMP

#include <hbapi.h>

HB_FUNC( CQUITACEROS )
{
   char * pszText = hb_parc( 1 );
   char * psz = pszText; 

   while( * psz != '.' && * psz != 0 )
      psz++;

   if( * psz != 0 )
   {
      psz = pszText + hb_parclen( 1 ) - 1;

      while( * psz == '0' )
         psz--;

      hb_retclen( pszText, psz - pszText + 1 );
   }
   else
      hb_retc( pszText );
}

#pragma ENDDUMP                 

Posted: Wed Dec 05, 2007 9:22 pm
by jlcapel
Antonio,

Eres un crack!! Muchas gracias!

Saludos,
José Luis Capel

PD: una pregunta de novatillo en esto del c...

Code: Select all

while( * psz != '.' && * psz != 0 ) 
      psz++;
Va de izquierda a derecha... ¿verdad?

Posted: Wed Dec 05, 2007 10:33 pm
by Antonio Linares
José Luis,

> Va de izquierda a derecha... ¿verdad?

Si, igual que en lenguaje Clipper :-)

Posted: Thu Dec 06, 2007 8:49 am
by tsales
Antonio, Jose Luis
Gracias a ambos. Funciona perfecto.

Posted: Thu Dec 06, 2007 4:26 pm
by jlcapel
Antonio,

A ver que te parece ésta. Va de derecha a izquierda :lol: :lol: :lol: .

Code: Select all

FUNCTION MAIN()

MsgInfo( cQuitaCeros("29384.234200000"))

RETURN NIL

#pragma BEGINDUMP

#include "hbapi.h"

HB_FUNC( CQUITACEROS )
{

   char * s = hb_parc(1);
   char * p = s ;
   p       += hb_parclen(1) -1;

   while ( *p == '0' || *p == '.')
   {
      if( *p == '.')
      {
         p--;
         break;
      }
      p-- ;
   }

   hb_retclen(s, p - s +1 );

}

#pragma ENDDUMP

Posted: Thu Dec 06, 2007 5:16 pm
by Antonio Linares
Jose Luis,

Está muy bien! :-)