Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



Mostrando entradas con la etiqueta librerias. Mostrar todas las entradas
Mostrando entradas con la etiqueta librerias. Mostrar todas las entradas

domingo, 29 de mayo de 2016

Gambas3: Uso de funciones Externas hechas en C

Gambas3: Uso de funciones Externas 

hechas en C 

Si necesitamos potencia de cálculo, o usar algunas funciones de C, gambas3 permite usarlas mediante la orden librery y la declaración de la función externa

El el siguiente video vamos a ver como usar la funcion externa "inkey()" y como crear la libreria ".so"

1) Tenemos el siguiente programa en c: "kpress.c"
/***
* kpress.c
*
* (c) 2004 ackbar
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termio.h>
#include <sys/ioctl.h>

#define STDINFD  0
#undef getc

int inkey(void);

int main() {
  int c;
  printf("Presione una tecla: ");
  c=inkey();
  printf("Codigo ASCII de la tecla presionada: [%d] Caracter: [%c]\n",c,c);
  return 0;
}

int inkey(void) {
  char c;
  struct termio param_ant, params;

  ioctl(STDINFD,TCGETA,&param_ant);
  params = param_ant;
  params.c_lflag &= ~(ICANON|ECHO);
  params.c_cc[4] = 1;

  ioctl(STDINFD,TCSETA,&params);

  fflush(stdin); fflush(stderr); fflush(stdout);
  read(STDINFD,&c,1);

  ioctl(STDINFD,TCSETA,&param_ant);
int v=c;
  return v;
}
/* EOF: kpress.c */


2) Vamos a crear la libreria ".so"
$gcc -o libkpress.so kpress.c -shared -fPIC

3) En gambas3, vamos a usar la funcion "inkey()"
' Gambas module file

Library "/tmp/libkpress"

Private Extern inkey() As Integer

Public Sub Main()
 
  Dim a As String
 
  Print "Hello world"
 
  Try Kill "/tmp/libkpress.so"
  Try Copy "libkpress.so" To "/tmp/libkpress.so"
 
  a = Chr$(inkey())
 
  Print a
 
End

Nota:
  Como podeis observar, el archivo "libkpress.so", esta en el directorio "Datos" del proyecto gambas, y se copia internamente al directorio /tmp para usarlo.


En este video se explican todos los pasos:



Código fuente: alojado en google drive

lunes, 15 de diciembre de 2014

Reutilización de Código en Gambas3:librerías y enlaces simbolicos

Reutilización de Código en Gambas3:

librerías y enlaces simbólicos 


Llega un momento en que recopilamos mucho código (funciones, módulos, clases, formularios) nuestros o de otros programadores , que podemos reutilizarlos en nuestros nuevos proyectos. ¿como hacerlo?. Os explico varias formas:

1) Copiar y pegar
La primera forma es simplemente copiarlos a nuestro proyecto,  que se puede hacer con el típico "copiar y pegar" del portapapeles o directamente copiando los archivos de código (.class, .module, .form) en nuestro proyecto (en la carpeta .src). Usando el IDE de gambas, esto se puede hacer con el menu del arbol del proyecto, con la opción "Nuevo" , elegir lo que queramos agregar al proyecto (una clase, un módulo o un formulario), y en el siguiente formulario ir a la pestaña  "Existente", seleccionando el directorio y el archivo que queramos añadir.


2) Creando librerías
Añadir al proyecto (menú proyecto/propiedades/ pestaña librerías) un ejecutable .gambas que contenga las clases "Exportables" (es importante esto, que las clases se hayan definido con la palabra Export http://gambaswiki.org/wiki/lang/export?l=es ), y así poderlas usar.
Este método hace que las "tripas" de las clases (su código fuente) estén ocultas para los que las usan. Es importante tener hecha la documentación (por ejemplo, usando comentarios en las funciones) para que se muestre la ayuda en el IDE, o tener un documento donde se especifique como se deben de usar los métodos, así facilitamos su uso.


El problema de estos dos métodos es que si por alguna razón (por ejemplo encontrarnos un bug), modificamos el código "original", también tendremos que repasar manualmente los proyectos donde lo hemos usado para actualizarlos a los cambios. En el 1º caso mediante el editor, (lo cual genera mucho trabajo de revisión y es sensible a fallos de mecanografiado). En el 2º caso simplemente tendremos que borrar y añadir la nueva librería .gambas, hago mucho  más rápido y simple.

3) Usamos "enlaces simbólicos"
El uso de "enlaces simbólicos",  es el método más eficaz, para que añadir clases, módulos o formularios. Este método permite que  si hacemos algún cambio en los archivos originales (Nota: deben de ser en los originales, no en nuestros archivos enlazados ya que estos no permiten modificarlos), por ejemplo corregir un bug, este cambio se transmite automáticamente a todos los proyectos que lo estén usándolo (nota: tendremos que cerrar y abrir el proyecto que estemos trabajando para que se actualicen los cambios).
Formulario de  añadir un archivo (clase, módulo o formulario)
 existente con la opción activada de "crear enlace simbólico"

La única desventaja es que  al crear archivos de distribución de código fuente, el  archivo .tar.gz, no se copian los "enlaces", sino los archivos a los que apunta. Por lo tanto la copia es completa pero sin la utilidad que tenemos con los enlaces simbólicos, para cuando cambiamos algo en los archivos originales.

4) Crear Componentes
Este método consiste en añadir al IDE de gambas, proyectos creados como "componentes". Este método lo desarrollaré en otro post, ya que son más pasos a seguir, y algo más complejo.
En el siguiente enlace, podéis ver un video de como se hace y su uso en un proyecto:
http://jsbsan.blogspot.com.es/2014/09/crear-un-componente-partir-de-otro.html


Fuente: 


domingo, 29 de diciembre de 2013

La potencia del C en Gambas


La potencia del C en Gambas

Gambas3, como Python y Java, es un lenguaje interpretado. Podemos crear  codebyte (.gambas), que son más rápidos que cuando se ejecutan en el IDE de Gambas, pero ¿que ocurre cuando necesitamos potencia de cálculo?
¿que hacer entonces?.


Gambas permite usar librerías externas realizadas en C, para aprovechar la velocidad/rendimiento  de este lenguaje en nuestros programas.

Os dejo aquí un simple ejemplo de realizar librerías en C, compilarlas y usarlas en un programa de Gambas.
Vamos a crear 3 funciones.
a) sumar: esta función recibe dos números y devuelve su suma (usando return)
b) duplica: recibe un vector y lo multiplica por 2, devolviendo el vector (sin usar return)
c) ValorarTablero: recibe una matrix cuadrada de N dimension, y devuelve la suma de sus componentes (usando return)

1º. definimos las cabeceras de las funciones que vamos a usar: archivo test.h
->

 2º definimos las funciones: test.c
->


3º Compilamos y creamos la libreria:
$ gcc -Wl,-soname=test.so -o test.so -std=c99 -fpic -shared -shared-libgcc test.c

4º Enviamos la libreria al directorio /usr/lib y creamos los enlaces (tenemos que ser root):
# cp test.so /usr/lib/test.so
# ldconfig /usr/lib


5º Ahora en Gambas, creamos un módulo, donde definimos las funciones externas:
->

6º Usamos las funciones en el programa:
->

He hecho un pequeño ejemplo, para comparar como mejora el uso de las funciones en C con las mismas funciones hechas en Gambas.

Este es el resultado del perfilado del programa (cuanto tarda cada función):
Donde se aprecia mayor mejora es en la funcion valorarTableroGambas y valorarTablero, ya que para hacer lo mismo, la función valorartablero solo tarda 283.209 (usa la libreria en C) y la de valorarTableroGambas tarda 56.053.209 (codigo nativo en Gambas3).

Descarga del completo ejemplo: https://app.box.com/s/fjvzuqm3921j25ifgb0h




Ejemplo de uso real: Programa de Cálculo de Estructuras
El proyecto Estrud3D (enlace: http://forge.gambas-es.org/projects/estru3d y http://www.gambas-es.org/viewtopic.php?f=5&t=3470&highlight=estru3d) es un programa realizado por Martín P. Cristiá inicialmente programado en Visual Basic y C,  que se está portando a Gambas. Para este programa es fundamental realizar los cálculos la estructura lo más rápido posible, y para ello, se usan librerías escritas y compiladas en  C que realizan "el trabajo duro" del cálculo, siendo usado Gambas, para definir la estructura (dimensiones, nodos, barras, tipos de materiales que se usa) y obtener los resultados (gráficos de esfuerzos e informes de todo tipo).




Fuentes:
http://www.gambas-es.org/viewtopic.php?f=4&p=19790#p19790
http://gambaswiki.org/wiki/lang/extdecl?l=es
http://gambaswiki.org/wiki/howto/extern?l=es