https://foro.gambas-es.org/viewtopic.php?f=1&t=4501
-----------------------------------
vuott
Friday, 03 April 2015, 00:17

Extern: Llamar Funciones Externas A Gambas
-----------------------------------
[color=#FFFFFF].[/color]

« [i][color=#E50000]De profundis clamavi te, functio externa ![/color][/i] »


[b]Preambulo[/b]

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.



[b]Introducción[/b]

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: [i]Extern[/i].

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

1) el [i]quid[/i] o sea lo que hacer, lo que conseguir;
2) la función externa que nos permite realizar aquel [i]quid[/i];
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 [i]lugar[/i] donde ella se encuentra. El lugar que contiene la función externa es la "[i]Librería[/i]"; 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" ([i]shared library[/i]).

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.



[b]Identificación y declaración de la Librería que contiene la Función externa[/b]

La Librería, que contiene la función externa que tenemos que llamar, puede ser declarada separadamente, y antes de la declaración [i]Extern[/i], a través de la palabra [b]Library[/b]:
[code linenumbers=false syntax=gambas]Library "libreria_externa:num_vers"

Extern......[/code]

La Librería, pero, puede ser también declarada dentro de la instrucción de [i]Extern[/i] a través de la palabra [b]In[/b]:
[code linenumbers=false syntax=gambas]Extern ................. In "libreria_externa:num_vers"[/code]

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 [i]libsane.so.1.0.23[/i]
Ella será escrita así:
[code linenumbers=false syntax=gambas]Library "libsane:1.0.23"[/code]



[b]Declaración de la Función externa mediante [i]Extern[/i][/b]

La Función externa, que tenemos que utilizar, debe ser declarada mediante la instrucción [i]Extern[/i]. 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:
   [code linenumbers=false syntax=c]int nombre_función(int valor1, char valor2)[/code]
en Gambas serà declarada:
   [code linenumbers=false syntax=gambas]Private Extern nombre_función(valor1 As Integer, valor2 As Byte) As Integer[/code]


[b]Orden de las declaraciones en el código del programa[/b]

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 [i]Extern[/i] 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:
     [code linenumbers=false syntax=C]int functio_externa(const char * valCadena, int valInteger)[/code]
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:

[code linenumbers=false syntax=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[/code]



[b]Ejemplo practico[/b]

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

[code linenumbers=false syntax=gambas]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[/code]


-----------------------------------
vuott
Friday, 03 April 2015, 00:37

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
...sigue...


[b]Utilizar una función que tiene un nombre igual a aquel de una función propia de Gambas[/b]

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 [i]Exec[/i].

En el siguiente ejemplo práctico tenemos que declarar y usar la función [i]kill[/i] que está contenida en la librería externa [i]libc:6[/i]:
  [code linenumbers=false syntax=c]int kill(pid_t pid, int sig)[/code]
El nombre de la función externa [i]kill[/i] del lenguaje C, pero, es idéntico a el nombre de la función [i]Kill[/i] 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 [i]Exec[/i]:
   [code linenumbers=false syntax=gambas]Private Extern kill_C(pid AS Integer, sig AS Integer) AS Integer In "libc:6" Exec "kill"[/code]
donde [i]kill_C[/i] es el nombre ficticio que usaremos en las rutinas; pero decimos a Gambas que debe usar la función externa de C: [i]kill[/i] .

Análogamente, usando la declaración de la librería con "[i]Library[/i]":
[code linenumbers=false syntax=gambas]Library "libc:6"

Private Extern kill_C(pid AS Integer, sig AS Integer) AS Integer Exec "kill"[/code]


-----------------------------------
jsbsan
Friday, 03 April 2015, 11:26

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


-----------------------------------
v3ctor
Friday, 03 April 2015, 14:01

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  :roll: 

no va ser facil  :shock:


-----------------------------------
v3ctor
Friday, 03 April 2015, 14:20

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.


-----------------------------------
v3ctor
Friday, 03 April 2015, 14:35

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  :P


postapase@postapase-desktop /etc $ apt show libsensors4
Paquete: libsensors4
Estado: instalado
Instalado automáticamente: no
Multiarquitectura: mismo
[color=#FF0000][b]Versión: 1:3.3.4-2ubuntu1[/b][/color]
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í?

[code linenumbers=false syntax=gambas]Library "libsensors4:3.3.4-2ubuntu1" [/code]   ?????

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/[b]libsensors.so.4.3.2[/b]
/usr/lib/i386-linux-gnu/mate-sensors-applet/plugins/liblibsensors.so
/usr/share/libsensors4
/usr/share/doc/libsensors4   :shock: 
/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


[code linenumbers=false syntax=gambas]Library "libsensors:4.3.2"[/code]


-----------------------------------
vuott
Friday, 03 April 2015, 15:04

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
[quote user="v3ctor" post="25688"] haciendo al menos un ejemplo sencillo de como usar una función de una librería externa 

[/quote]
[quote user="v3ctor" post="25690"]libsensors.so.4

[/quote]

....la libreria [i]libsensors.so.4[/i] te parece una libreria facil ???   


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


-----------------------------------
vuott
Friday, 03 April 2015, 15:19

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
El ejemplo practico que hice creo que sea muuuuuy sencillo.

Lo hago mas simple:
[code linenumbers=false syntax=gambas]
' 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[/code]
Mas simple... se muere !   [img]http://www.gambas-it.org/smf/Smileys/gambasit-emoticons/undecided.gif[/img]


-----------------------------------
vuott
Saturday, 04 April 2015, 00:16

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.php?topic=3990.msg35404#msg35404


-----------------------------------
razaAztk
Monday, 15 August 2016, 23:06

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://foro.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.


-----------------------------------
shordi
Tuesday, 16 August 2016, 07:38

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
Magnífico currele, Vuott. +1 :mrorange:  :mrorange:


-----------------------------------
v3ctor
Sunday, 07 May 2017, 00:53

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
Al fin logre hacer un ejemplo, creo que por primera vez voy comprendiendo como es el asunto de las librerías externas.
También me doy cuenta del poder que esto significa para cualquier aplicación, estamos hablando de aprovechar millones de librerías disponibles.

aquí el código:


[code linenumbers=false syntax=gambas]' Declarada la libreria que contiene la función externa que usaremos.
Library "libc:6"

'Experimenta con este código para aprender la razón de los errores
'Library "libc:5" 
'Library "libc"

'Declara la función externa. 
'Devuelve una cadena que describe el significado del número de señal.

Private Extern strsignal(senal As Integer) As String

Public Sub Form_Open()
  
  Dim a As Integer
  Dim informe As String
  
  Me.Title = "Uso de función externa"  
  
  For a = 0 To 40
    Print "Número de señal=" & a & "  --->" & strsignal(a)
    informe &= "Número de señal=" & a & "  --->" & strsignal(a) & gb.NewLine
    Wait 0.2
  Next
  
  TextArea1.Text = informe 
  TextArea1.Pos = 0
  
End


' postapase@postapase / $ locate libc.so
' /lib/i386-linux-gnu/libc.so.6    <------  Library "libc:6"
' /usr/lib/i386-linux-gnu/libc.so
' 

Public Sub URLLabel1_Click()

  Desktop.Open(URLLabel1.Link)

End[/code]

el ejemplo lo subí a la granja y pronto lo subo a mi blog 

ando con ganas de hacer un ejemplo con java y otro con python a ver si me salen  :lol: 

 [img]https://foro.gambas-es.org/files/images/2261/libc.png[/img] 

Saludos


-----------------------------------
vuott
Sunday, 07 May 2017, 01:15

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
Bravo, [i]v3ctor[/i]: abriste para ti un nuevo vasto mundo !   :smile:


-----------------------------------
v3ctor
Sunday, 07 May 2017, 01:43

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
[quote user="vuott" post="37987"]Bravo, [i]v3ctor[/i]: abriste para ti un nuevo vasto mundo !   :smile:[/quote]

Gracias a vos vuott que pusiste la piedra angular en el tema de librerías externas! en estos días voy a estudiar y practicar mucho con las librerías externas así afirmo lo básico que hoy aprendí y me vuelvo mas hábil  :lol: 

mirando el código fuente de las funciones he visto muchas que son muy simples e ideales para hacer ejemplos.
tanto que sin saber c++ se puede entender mas o menos lo que hace la función.

Saludos.


-----------------------------------
v3ctor
Sunday, 07 May 2017, 02:10

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
esta página puede ayudar a los que quieran incursionar en este tema.


http://c.conclase.net/curso/?cap=902f


-----------------------------------
v3ctor
Sunday, 07 May 2017, 02:24

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
otra cosa que me olvidaba, para que nos sea mas fácil identificar funciones dentro de los archivos c o c++

podes usar el programa Geany 

http://www.geany.org/


-----------------------------------
vuott
Sunday, 07 May 2017, 02:34

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
[quote user="v3ctor" post="37990"]para que nos sea mas fácil identificar funciones dentro de los archivos c o c++[/quote]

...es suficiente buscar en los archivo [i]header[/i] (.h) que contienen los prototipos de las funciones de una librería.


-----------------------------------
vuott
Sunday, 07 May 2017, 02:44

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
[i]v3ctor[/i], el momento más complicado será cuando tú tendrás que gestionar utilizando eventuales Estructuras externas !


-----------------------------------
v3ctor
Sunday, 07 May 2017, 03:47

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
[quote user="vuott" post="37991"][quote user="v3ctor" post="37990"]para que nos sea mas fácil identificar funciones dentro de los archivos c o c++[/quote]

...es suficiente buscar en los archivo [i]header[/i] (.h) que contienen los prototipos de las funciones de una librería.[/quote]

tienes razón... mira que fácil....

/* Copy SRC to DEST.  */
extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
     __THROW __nonnull ((1, 2));
/* Copy no more than N characters of SRC to DEST.  */
extern char *strncpy (char *__restrict __dest,
		      const char *__restrict __src, size_t __n)
     __THROW __nonnull ((1, 2));

/* Append SRC onto DEST.  */
extern char *strcat (char *__restrict __dest, const char *__restrict __src)
     __THROW __nonnull ((1, 2));
/* Append no more than N characters from SRC onto DEST.  */
extern char *strncat (char *__restrict __dest, const char *__restrict __src,
		      size_t __n) __THROW __nonnull ((1, 2));

/* Compare S1 and S2.  */
extern int strcmp (const char *__s1, const char *__s2)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* Compare N characters of S1 and S2.  */
extern int strncmp (const char *__s1, const char *__s2, size_t __n)
     __THROW __attribute_pure__ __nonnull ((1, 2));

/* Compare the collated forms of S1 and S2.  */
extern int strcoll (const char *__s1, const char *__s2)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* Put a transformation of SRC into no more than N bytes of DEST.  */
extern size_t strxfrm (char *__restrict __dest,
		       const char *__restrict __src, size_t __n)
     __THROW __nonnull ((2));
__END_NAMESPACE_STD


-----------------------------------
v3ctor
Monday, 15 May 2017, 17:47

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
[quote user="vuott" post="37991"][quote user="v3ctor" post="37990"]para que nos sea mas fácil identificar funciones dentro de los archivos c o c++[/quote]

...es suficiente buscar en los archivo [i]header[/i] (.h) que contienen los prototipos de las funciones de una librería.[/quote]

archivos c : .h   y .c
archivos c++ : .hh y .cc

también da la información cuando ponemos en vistas: ver lista

dejo otra página que encontré con mucha info sobre librerías y sus funciones y descripciones(para que sirven)
http://www.cplusplus.com/reference/clibrary/


-----------------------------------
Shell
Thursday, 30 August 2018, 11:34

Re: Extern: Llamar Funciones Externas A Gambas
-----------------------------------
Bravo Vuott.

Buen tema.

De la cantidad que debo tener como temas fijos debería haber favoritos de los marcadores.  :!: 
Cuanto tiempo hace que no los reviso.  :roll: 

Saludos


