FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Funciones C en Harbour
Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Funciones C en Harbour
Posted: Mon Feb 08, 2021 01:58 PM
Hola

Perdonad mi desconocimiento.
Pero estoy viendo codigo fuente de funciones de Fivewin, y veo que muchas de ellas estan hechas en lenguaje C,
la verdad no soy un experto en C, pero como creo que casi todos, se un poquito , pero no entiendo el formato de dichas funciones.
Ejemplo.
Code (fw): Select all Collapse
HB_FUNC( ANIMOPEN ) // ( hWnd, cAviFileRes ) --> lResult
{
   #ifndef _WIN64
      hb_retl( Animate_Open( ( HWND ) hb_parnl( 1 ), hb_parc( 2 ) ) );
   #else
      hb_retl( Animate_Open( ( HWND ) hb_parnll( 1 ), hb_parc( 2 ) ) );
   #endif
}


Esta funcion veo que en los comentarios explica que recibe 2 parametros, pero.. Dudas.

1.- ¿porque hace #ifndef_WIN64 si luego el else es la misma sentencia, identica.?
2.- hb_retl es una funciona Harbour que recibe como parametro un entero y devuelve un entero (creo) entonces como se le pase como
parametro Animate_Open que devuelve void.) ¿?

Gracias por vuestra inestimable ayuda.

Saludos.

Jose
Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: Funciones C en Harbour
Posted: Mon Feb 08, 2021 04:15 PM
jvtecheto wrote:1.- ¿porque hace #ifndef_WIN64 si luego el else es la misma sentencia, identica.?


La sentencia no es identica: hb_parnl / hb_parnll

jvtecheto wrote:2.- hb_retl es una funciona Harbour que recibe como parametro un entero y devuelve un entero (creo)


No, devuelve un logico.

jvtecheto wrote:entonces como se le pase como parametro Animate_Open que devuelve void.) ¿?


Si Animate_Open devuelve void, esto es un error.

EMG
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: Funciones C en Harbour
Posted: Mon Feb 08, 2021 04:21 PM

Hola Jose,
En el ejemplo que presenta puedes ver que las sentencias no son identicas. Fijate que la primera tiene hb_parnl() y la segunda hb_parnll().
Con relacion al formato a usar lo puedes escribir dentro de cualquier archivo PRG.

Mira este ejemplo para crear una funcion denominada "C_2EXP()" con el proposito de elevar a un exponente n el numero 2 :

pragma BEGINDUMP

include <hbapi.h>

include <math.h>

HB_FUNC( C_2EXP )
{
long long n, nResult;

n = hb_parnll(1);
nResult = pow(2,n);
hb_retnll(nResult);
}

pragma ENDDUMP

Desde tu programa la llamaria asi:
n2 := C_2EXP(4)
? "n2", n2

Saludos,

George

Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Funciones C en Harbour
Posted: Mon Feb 08, 2021 09:06 PM

Syntax
void Animate_Open( hwnd, szName);

Parameters
hwnd
Type: HWND
A handle to the animation control.

szName
Type: LPTSTR

A pointer to a buffer that contains the path of the AVI file or the name of an AVI resource. Alternatively, this parameter can consist of the AVI resource identifier in the LOWORD and zero in the HIWORD. To create this value, use the MAKEINTRESOURCE macro. The control loads an AVI resource from the module specified by the instance handle passed to the CreateWindow function, the Animate_Create macro, or the dialog box creation function that created the control. The AVI file or resource specified by lpszName must not contain audio.

If this parameter is NULL, the system closes the AVI file that was previously opened for the specified animation control, if any.


de lo poco que se.

Code (fw): Select all Collapse
HB_FUNC( ANIMOPEN ) // ( hWnd, cAviFileRes ) --> lResult
{
   #ifndef _WIN64 //se resuelve en tipo de compilacion
      hb_retl( Animate_Open( ( HWND ) hb_parnl( 1 ), hb_parc( 2 ) ) ); //aca con hb_parnl( 1) recuperamos el 1er parametro de tipo numerico entero largo(32 bits o 4byte), con hb_parc(2) recuperamos el segundo parametro tipo cadena. 
   #else
      hb_retl( Animate_Open( ( HWND ) hb_parnll( 1 ), hb_parc( 2 ) ) ); //aca con hb_parnll( 1) recuperamos el 1er parametro de tipo numerico entero largo largo(64 bits o 8byte), con hb_parc(2) recuperamos el segundo parametro tipo cadena. 
   #endif
}

hb_parl returna un valor numerico 0 (el cual es falso) o diferente a cero (lo cual seria verdadero), para todo los efecto retorna un valor logico, de ahi la letra l de logico.
que es diferente de hb_parni el cual es un retorno de tipo entero y hb_retnl el cual retorna un valor entero largo.

( HWND ) hb_parnl( 1 )-> se hace una conversion a de un entero largo a un handle window.
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Funciones C en Harbour
Posted: Wed Feb 10, 2021 12:05 AM
A tu pregunta de porque hace una comprobación en tiempo de compilación de dos sentencias que son idénticas, está claro que no lo son una tiene hb_panl() y la otra hb_panll()
La primera recibe un entero largo y la segunda para win64 un entero largo largo.
Si te das cuentas el primer parámetro realmente es un manejador de venta o lo que es lo mismo un puntero a la estructura interna de definición de una ventana.
Harbour tiene para eso una función de tipo hb_parxx() es la hb_parptr() que esta definida así:

extern HB_EXPORT void * hb_parptr( int iParam ); /* retrieve a parameter as a pointer */

Si se usa será el propio compilador el que determine la memoria que ocupa el puntero, aunque no podrás evitar hacer cast.
La función quedaría así directamente:

Code (fw): Select all Collapse
HB_FUNC( ANIMOPEN ) // ( hWnd, cAviFileRes ) --> lResult
{
      hb_retl( Animate_Open( ( HWND ) hb_parptr( 1 ), hb_parc( 2 ) ) );
}
______________________________________________________________________________

Sevilla - Andalucía
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Funciones C en Harbour
Posted: Wed Feb 10, 2021 09:24 AM

La función hb_parptr() se implementó en Harbour con bastante posterioridad respecto a hb_parnl() y hb_parnll()
de ahi que usásemos la técnica de hb_parnl()/hb_parnll() en FWH en vez de hb_parptr() que basicamente lo que hace es lo mismo :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 422
Joined: Mon Aug 17, 2009 12:18 PM
Re: Funciones C en Harbour
Posted: Wed Feb 10, 2021 06:34 PM

Hola Manuel,

Al final, ¿ibas a organizar un curso de C y Harbour?

Gracias.

Saludos,



Eduardo
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Funciones C en Harbour
Posted: Wed Feb 10, 2021 11:56 PM

Era mi idea...
Pero la cosa se enfrió por falta de cuorum.

Ahora estoy a tope con mi proyecto HDO que está hecha 100x100 en C.
Está basado en un método que permite crea clases de Harbour en C.

Pero bueno si la peña se anima no lo descarto. :oops:

______________________________________________________________________________

Sevilla - Andalucía
Posts: 11
Joined: Thu Jun 06, 2019 01:15 PM
Re: Funciones C en Harbour
Posted: Thu Feb 11, 2021 06:49 AM
xmanuel wrote:Era mi idea...
Pero la cosa se enfrió por falta de cuorum.

Ahora estoy a tope con mi proyecto HDO que está hecha 100x100 en C.
Está basado en un método que permite crea clases de Harbour en C.

Pero bueno si la peña se anima no lo descarto. :-)
+1

Enviado desde mi moto g(9) plus mediante Tapatalk
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Funciones C en Harbour
Posted: Thu Feb 11, 2021 02:16 PM
Por cierto he estado mirando en Google y "Animate_Open" no devuelve nada por lo esta funcion en este momento esta mal diseññada.
No se si en algún momento si devolvia algo

Code (fw): Select all Collapse
Animate_Open macro (commctrl.h)

Opens an AVI clip and displays its first frame in an animation control. You can use this macro or send the ACM_OPEN message explicitly.

Syntax
C++

Copy
void Animate_Open(
   hwnd,
   szName
);
Parameters
hwnd

Type: HWND

A handle to the animation control.

szName

Type: LPTSTR

A pointer to a buffer that contains the path of the AVI file or the name of an AVI resource. Alternatively, this parameter can consist of the AVI resource identifier in the LOWORD and zero in the HIWORD. To create this value, use the MAKEINTRESOURCE macro. The control loads an AVI resource from the module specified by the instance handle passed to the CreateWindow function, the Animate_Create macro, or the dialog box creation function that created the control. The AVI file or resource specified by lpszName must not contain audio.

If this parameter is NULL, the system closes the AVI file that was previously opened for the specified animation control, if any.

Return value
None


Si esta en FWH posiblemente Antonio lo deba cambiar a:

Code (fw): Select all Collapse
HB_FUNC( ANIMOPEN ) // ( hWnd, cAviFileRes ) --> none
{
      Animate_Open( ( HWND ) hb_parptr( 1 ), hb_parc( 2 ) );
}
______________________________________________________________________________

Sevilla - Andalucía
Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Re: Funciones C en Harbour
Posted: Thu Feb 11, 2021 03:10 PM

Muchisimas gracias a todos por contestar, es un honor para mi que gente tan importante
empleen parte de su valioso tiempo por una duda mia.

Manu lo del curso estoy interesado, eso si el ultimo de la fila :D , preparame las orejas.

Un abrazo a todos amigos.

Jose.

Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64
Posts: 728
Joined: Fri Oct 07, 2005 07:38 AM
Re: Funciones C en Harbour
Posted: Thu Feb 11, 2021 03:26 PM

Interesante lo del curso ... cojo sitio :D

Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
Posts: 990
Joined: Wed Oct 19, 2005 02:17 PM
Re: Funciones C en Harbour
Posted: Fri Feb 12, 2021 08:44 AM

Buenos días / Egun on !!!

Quedan plazas libres ;-) ? Me da igual, tener que estar al fondo de la clase que en el quicio de la puerta.

Muchas gracias.

Saludos,

Posts: 476
Joined: Sat Feb 03, 2007 06:36 AM
Re: Funciones C en Harbour
Posted: Fri Feb 12, 2021 12:19 PM

Pues otro mas, me apunto para estar al fondo de la clase también.
Gracias Manu

Saludos

Carlos

Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Re: Funciones C en Harbour
Posted: Fri Feb 12, 2021 01:09 PM

Hola

Bueno esto empieza a andar, sino ciento mal seríamos 6 por ahora, cuantos alumnos te hacen falta Manu?

Saludos

Jose.

Enviado desde mi POCOPHONE F1 mediante Tapatalk

Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64