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[i] != '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[i] != '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: 42448
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 20 times
- Been thanked: 56 times
- 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 futuros cambios.
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 futuros cambios.
Aún así, puedes superar esa barrera de esta forma:
#define _HB_API_INTERNAL_
#include <hbapi.h>
Antonio,
Entonces... ¿como debemos tratar los punteros a ITEM de Harbour? ¿Cuales funciones podríamos usar?
Saludos y gracias por tu luz.
José Luis Capel
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 futuros cambios.
Entonces... ¿como debemos tratar los punteros a ITEM de Harbour? ¿Cuales funciones podríamos usar?
Saludos y gracias por tu luz.
José Luis Capel
- Antonio Linares
- Site Admin
- Posts: 42448
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 20 times
- Been thanked: 56 times
- Contact:
- Antonio Linares
- Site Admin
- Posts: 42448
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 20 times
- Been thanked: 56 times
- Contact:
Bueno, tambien han hecho falta hb_parclen() y hb_retclen() ![Smile :-)](./images/smilies/icon_smile.gif)
Aqui la teneis funcionando:
![Smile :-)](./images/smilies/icon_smile.gif)
Aqui la teneis funcionando:
Code: Select all | Expand
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 | Expand
while( * psz != '.' && * psz != 0 )
psz++;
Va de izquierda a derecha... ¿verdad?
- Antonio Linares
- Site Admin
- Posts: 42448
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 20 times
- Been thanked: 56 times
- Contact:
Antonio,
A ver que te parece ésta. Va de derecha a izquierda
.
A ver que te parece ésta. Va de derecha a izquierda
![Laughing :lol:](./images/smilies/icon_lol.gif)
![Laughing :lol:](./images/smilies/icon_lol.gif)
![Laughing :lol:](./images/smilies/icon_lol.gif)
Code: Select all | Expand
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: 42448
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 20 times
- Been thanked: 56 times
- Contact: