Quitar Ceros de la derecha. Error al compilar
Quitar Ceros de la derecha. Error al compilar
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;
}
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;
}
Toni Sales
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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>
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>
Antonio,
Saludos y gracias por tu luz.
José Luis Capel
Entonces... ¿como debemos tratar los punteros a ITEM de Harbour? ¿Cuales funciones podríamos usar?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 _.
Saludos y gracias por tu luz.
José Luis Capel
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Bueno, tambien han hecho falta hb_parclen() y hb_retclen()
Aqui la teneis funcionando:
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
Antonio,
Eres un crack!! Muchas gracias!
Saludos,
José Luis Capel
PD: una pregunta de novatillo en esto del c...
Va de izquierda a derecha... ¿verdad?
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++;
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Antonio,
A ver que te parece ésta. Va de derecha a izquierda .
A ver que te parece ésta. Va de derecha a izquierda .
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact: