Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Extern: Llamar Funciones Externas A Gambas
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Extern: Llamar Funciones Externas A Gambas 
 
.

« De profundis clamavi te, functio externa ! »


Preambulo

Para utilizar las funciones externas en gambas, es oportuno:
1) tener un conocimiento por lo menos elemental del lenguaje C;
2) conocer el funcionamento de las funciones en Gambas.



Introducción

gambas permite utilizar potencialidad y capacidad de sistemas a través de la llamada de funciones externas. A veces en efecto puede ocurrir en la programación la necesidad de utilizar potencialidad que gambas no puede ofrecer. La instrucción que gambas pone a disposición del programador para llamar tales funciones externas es: Extern.

Por la llamada de funciones externas es necesario conocer en particular tres elementos:

1) el quid o sea lo que hacer, lo que conseguir;
2) la función externa que nos permite realizar aquel quid;
3) la librería en la que es contenida la función por volver a llamarla.

Si lo que se quiere conseguir sólo es posible por el empleo de una función externa a gambas, hará falta localizar la específica función que permite realizar nuestro objetivo. La función externa, útil al objetivo del programa, tendrá que ser llamada por nuestro programa gambas. Ya que tal función externa es escrita en C, hará falta interpretar el significado y traducirla en forma comprensible para gambas. Además, ya que ella es exterior a gambas, hará falta conocer el lugar donde ella se encuentra. El lugar que contiene la función externa es la "Librería"; y más bien una específica librería, ella que, por tanto, deberá ser declarada en antelación con respecto de la función.
Las librerías, que contienen funciones externas a gambas, utilizables por gambas, son aquellas con extensión .so, o sea las "Librerías dinámicas" (shared library).

Es oportuno, cuando posible, también indicar el número de la versión de la Librería. Además, si la librería se encuentra en una carpeta diferente de aquél dedicado a las librerías (/usr/lib/), será necesario también precisar la su ruta.



Identificación y declaración de la Librería que contiene la Función externa

La Librería, que contiene la función externa que tenemos que llamar, puede ser declarada separadamente, y antes de la declaración Extern, a través de la palabra Library:
Library "libreria_externa:num_vers"

Extern......


La Librería, pero, puede ser también declarada dentro de la instrucción de Extern a través de la palabra In:
Extern ................. In "libreria_externa:num_vers"


Si el número de la versión de la Librería es complejo, deberá ser escrito tal como indicado en el fichero de la Librería. La parte .so. debe ser reemplazada con el carácter de los dos puntos ( : ).
Hacemos el ejemplo de la Librería libsane.so.1.0.23
Ella será escrita así:
Library "libsane:1.0.23"




Declaración de la Función externa mediante Extern

La Función externa, que tenemos que utilizar, debe ser declarada mediante la instrucción Extern. Esta declaración tiene que ser efectuada externamente a las rutinas.
La declaración tiene que contener:
1) el nombre de la función externa que utilizaremos;
2) la especificación de los eventuales argumentos de la función externa (tal como por las funciones de gambas);
3) el eventual valor de regreso.

La declaración puede ser "Public" o "Private".

Un ejemplo abstracto de declaración de una función externa declarada en C en esta manera:
  
int nombre_función(int valor1, char valor2)

en gambas serà declarada:
  
Private Extern nombre_función(valor1 As Integer, valor2 As Byte) As Integer



Orden de las declaraciones en el código del programa

La función real, que tenemos que llamar por su empleo, será puesta dentro de una rutina. Pues, en el caso de declaración separada de la Librería, el guión de las declaraciones será:
1) declaración de la Librería que contiene la función;
2) declaración a través de Extern de la función externa que se utilizará (esta declaración ocurrirá fuera de la rutina que utilizará aquella función);
3) llamada y empleo de la función externa.


En este ejemplo abstracto la función externa que tenemos que utilizar es declarada en C:
    
int functio_externa(const char * valCadena, int valInteger)

Pues los dos argumentos de la función son: una cadena y un Integer. Ella regresa un valor Integer.
Bueno, el codigo de ejemplo en Gambas:

Library "libreria_externa:num_version"


' En gambas la declararemos asì:
Private Extern functio_externa($val As String, Ival As Integer) As Integer

' La función serà utilizada en las rutinas por ejemplo asì:
Public Sub Button1_Click()

Dim primeroValor As String
Dim segundoValor As Integer
Dim rit_funz As Integer

  primeroValor = "una cadena"

  segundoValor = 1000

  rit_funz = functio_externa(primeroValor, segundoValor)

' Vamos a ver en console el valor regresado por la función externa:
  Print rit_funz

End




Ejemplo practico

Ahora vamos a ver un ejemplo practico, donde tenemos dos funciones externas matematicas de la libreria  libm .

Library "libm:6"

' double modf(double x, double *integer)
' Returns the fraction component (part after the decimal), and sets integer to the integer component.
Private Extern modf(xF As Float, pp As Pointer) As Float

' double fmod(double x, double y)
' Returns the remainder of x divided by y.
Private Extern fmod(xF As Float, yF As Float) As Float


Public Sub Main()

  Dim p As Pointer = Alloc(SizeOf(gb.Float))

   Print modf(5.123456, p)
   Print fmod(5.654321, 2)

   Free(p)

End

 



 
última edición por vuott el Martes, 16 Agosto 2016, 02:24; editado 23 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
...sigue...


Utilizar una función que tiene un nombre igual a aquel de una función propia de Gambas

Cuando tenemos que utilizar una función que tiene un nombre igual a aquel de una función propia de gambas, es formalmente necesario usar un nombre diferente indicando, en la declaración, el verdadero nombre de la función externa precedido por el mando Exec.

En el siguiente ejemplo práctico tenemos que declarar y usar la función kill que está contenida en la librería externa libc:6:
  
int kill(pid_t pid, int sig)

El nombre de la función externa kill del lenguaje C, pero, es idéntico a el nombre de la función Kill de gambas. Pues, asignaremos a la función externa un cualquier nombre, a condición que sea diferente del nombre de cada otra función de gambas. Llamaremos su verdadero nombre al acto de la declaración de la función externa, haciendo precederlo del mando Exec:
  
Private Extern kill_C(pid AS Integer, sig AS Integer) AS Integer In "libc:6" Exec "kill"

donde kill_C es el nombre ficticio que usaremos en las rutinas; pero decimos a gambas que debe usar la función externa de C: kill .

Análogamente, usando la declaración de la librería con "Library":
Library "libc:6"

Private Extern kill_C(pid AS Integer, sig AS Integer) AS Integer Exec "kill"

 



 
última edición por vuott el Viernes, 03 Abril 2015, 12:46; editado 6 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
Vuott:

Muy interesante. Aqui lo importante es conocer bien la libreria externa, que parámetros admite y que devuelve.

+1 Vuott

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
Vuott:

Muchísimas gracias, excelente,

voy a ver si hago los deberes haciendo al menos un ejemplo sencillo de como usar una función de una librería externa y lo publicare en este hilo.


no se pienso que para hacer un primer ejemplo habría que buscar una librería muy conocida con mucha documentación en español.

eso hare  

no va ser facil  
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
última edición por v3ctor el Viernes, 03 Abril 2015, 15:08; editado 1 vez 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
dep: libsensors4 (>= 1:3.1.1)
    Biblioteca para leer los sensores de temperatura/voltaje/ventiladores

propongo algo al foro:

1-conseguir documentación de libsensor4s
2-conocer sus funciones.
3-que cada forero que quiera y se sume haga un ejemplo supersimple con alguna de las funciones de la librería como modo de aprendizaje y ejercicio y que voutt nos vaya orientando sin darnos la solución ni el código.
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
aquí una pagina de ejemplo donde se explican las funciones de una librería.

http://linux.die.net/man/3/libsensors

para ir haciendo ambiente  


postapase@postapase-desktop /etc $ apt show libsensors4
Paquete: libsensors4
Estado: instalado
Instalado automáticamente: no
Multiarquitectura: mismo
Versión: 1:3.3.4-2ubuntu1
Prioridad: opcional
Sección: libs
Desarrollador: Ubuntu Developers <ubuntu>
Arquitectura: i386
Tamaño sin comprimir: 140 k
Depende de: libc6 (>= 2.4)
Predepende de: multiarch-support
Sugiere: lm-sensors
Descripción: Biblioteca para leer los sensores de temperatura/voltaje/ventiladores
 Lm-sensors es un paquete para la monitorización de la salud de dispositivos
 hardware en Linux. Le permite acceder a la información de los sensores de
 temperatura, voltaje y velocidad de los ventiladores. Funciona en la mayoría de
 los sistemas más actuales.
 
 Este paquete contiene una biblioteca compartida para hacer peticiones a
 lm-sensors.
Página de inicio: http://www.lm-sensors.org


la declaración seria así?

Library "libsensors4:3.3.4-2ubuntu1"
   ?????

no no no lo anterior esta errado no busque la  info en el lugar adecuado a ver ahora:

postapase@postapase-desktop /lib $ locate libsensors
/usr/lib/i386-linux-gnu/libsensors.so.4
/usr/lib/i386-linux-gnu/libsensors.so.4.3.2
/usr/lib/i386-linux-gnu/mate-sensors-applet/plugins/liblibsensors.so
/usr/share/libsensors4
/usr/share/doc/libsensors4  
/usr/share/doc/libsensors4/NEWS.Debian.gz
/usr/share/doc/libsensors4/README.Debian
/usr/share/doc/libsensors4/changelog.Debian.gz
/usr/share/doc/libsensors4/copyright
/var/lib/dpkg/info/libsensors4:i386.conffiles
/var/lib/dpkg/info/libsensors4:i386.list
/var/lib/dpkg/info/libsensors4:i386.md5sums
/var/lib/dpkg/info/libsensors4:i386.postinst
/var/lib/dpkg/info/libsensors4:i386.postrm
/var/lib/dpkg/info/libsensors4:i386.preinst
/var/lib/dpkg/info/libsensors4:i386.shlibs
/var/lib/dpkg/info/libsensors4:i386.symbols


Library "libsensors:4.3.2"

 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
última edición por v3ctor el Viernes, 03 Abril 2015, 15:54; editado 2 veces 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
v3ctor escribió:  
haciendo al menos un ejemplo sencillo de como usar una función de una librería externa


v3ctor escribió:  
libsensors.so.4



....la libreria libsensors.so.4 te parece una libreria facil ???  


De todas maneras tu puedes encontrar en este foro un ejemplo:
http://www.gambas-es.org/viewtopic.php?f=5&t=4210
 



 
última edición por vuott el Viernes, 22 May 2015, 23:58; editado 1 vez 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
El ejemplo practico que hice creo que sea muuuuuy sencillo.

Lo hago mas simple:
' Es declarada la libreria que contiene la función externa que queremos utilizar:
Library "libm:6"

' Es declarata la función externa. Esta tiene dos argumentos de tipo "double" que en gambas es "Float".
' La función devuelve un "double", es decir un "Float".
' double fmod(double x, double y)
' Returns the remainder of x divided by y.
Private Extern fmod(x As Float, y As Float) As Float


Public Sub Main()

  Dim fl As Float

' llamamos a la función externa:
   fl = fmod(5.654321, 2)

' Vamos a ver en console el resultado:
   Print fl

End

Mas simple... se muere !   undecided
 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
...sigue...


Claramente podemos crear nosotros mismos una librería externa.

Vamos a mirar este mi ejemplo en el foro de gambas-it.org:
http://www.gambas-it.org/smf/index....g35404#msg35404
 



 
última edición por vuott el Sabado, 04 Abril 2015, 02:23; editado 1 vez 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Extern: Llamar Funciones Externas A Gambas 
 
Muy interesante. Me viene bien para una implementación que quiero realizar. Gracias.

Creo éste contenido debe estar en la base de conocimentos del foro https://www.gambas-es.org/kb.php?mode=cat&cat=1
Habrá alguna forma de mover el post???? Así nos será más fácil ubicarlo.

Saludos.
 



 
razaAztk - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuarioVer la galería personal del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
10.00 10 10 1
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario