Desarrollando Libreria Para Operadores Con Bit [Solucionado]


Ir a la página 1, 2, 3  Siguiente

Objetivo: Desarrollando Libreria Para Operadores Con Bit [Solucionado]
Bueno sigo con el tema de los operadores con bit,
operadores_bit_a_bit
estoy intentando hacer una libreria en C para llamarla desde gambas3

Me he hecho en programita en C:
#include <stdio>

// ejemplo tomado de: http://www.zator.com/Cpp/E4_9_3.htm
// para compilar: gcc libm.cpp -o m
// para ejecutar: ./libm

// crear libreria .so:
// gcc -o libm.so libm.cpp -shared -fPIC


//x &= y; // equivale a: x = (x & y);
//x ^= y; // equivale a: x = (x ^ y);
//x |= y; // equivale a: x = (x | y);



int BitBarraVertical(int x,int y)
{
return x|=y;
}

int BitAmpersand(int x,int y)
{
return x&=y;
}

int BitComplemento(int x,int y) // complemento a uno'
{
return x=~y;
}


int BitPotencia(int x,int y)
{
return x^=y;
}



int main() {
signed int x = 2, y = 7, z = 6, a = 2, b= -2;

printf("Valor Inicial x = %d \n", x);
printf("Valor Inicial y = %d \n", y );
printf("Valor Inicial z = %d \n", z );
printf("Valor Inicial a = %d \n", a );
printf("Valor Inicial b = %d \n", b );


printf("\nOperaciones:\n") ;

printf("x &= -2\n");
printf("y ^= -2\n");
printf("z |= 13\n");
printf("a ~= 1\n");

x &= -2;
y ^= -2;
z |= 13;
a <<1>>= 1;

printf("\nResultado:\n") ;
printf("Valor x = %d \n", x);
printf("Valor y = %d \n", y );
printf("Valor z = %d \n", z );
printf("Valor a = %d \n", a );
printf("Valor b = %d \n", b );


x = 2;
y = 7;
z = 6;
a = 2;
b= -2;

x= BitAmpersand(x,-2);
y= BitPotencia(y,-2);
z= BitBarraVertical(z,13);




printf("\nResultado con funciones:\n") ;
printf("Valor x = %d \n", x);
printf("Valor y = %d \n", y );
printf("Valor z = %d \n", z );



}


Luego lo compilo, y creo el archivo .so:
gcc -o libm.so libm.cpp -shared -fPIC

El archivo que crea lo copio en el mismo directorio donde estoy creando el programa en gambas3 (para que lo encuentre sin problemas)

Ahora me hago el programita en gambas3:
' gambas module file
library "libm"

private extern BitBarraVertical(x as integer,y as integer) as integer
private extern BitAmpersand(x as integer,y as integer) as integer
private extern BitPotencia(x as integer,y as integer) as integer


Public Sub Main()
dim n as integer
dim x as integer=2
dim y as integer=7
dim z as integer=6



x= BitAmpersand(x,-2)
y= BitPotencia(y,-2)
z= BitBarraVertical(z,13)

print "aplicando funciones externas:"
print "x ",x
print "y ",y
print "z ",z

end


Y cuando lo ejecuto me dice:
Citar:
MMain.Main.20: #61: Cannot find symbol 'BitAmpersand' in dynamic library 'libm'
1: MMain.Main.20


Osea que es como si no encontrare la función "BitAmpersand" en la libreria libm....

¿alguna ayuda?

última edición por jsbsan el Jueves, 19 May 2016, 11:54; editado 3 veces
Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
El tu codigo en C++ al compilarlo me da estos errores:

/tmp/c.cpp: In function ‘int BitBarraVertical(int, int)’:
/tmp/c.cpp:23:11: error: ‘PIPE’ was not declared in this scope
return x<PIPE>=y;
^
/tmp/c.cpp: In function ‘int main()’:
/tmp/c.cpp:47:37: error: ‘printf’ was not declared in this scope
printf("Valor Inicial x = %d \n", x);
^
/tmp/c.cpp:63:4: error: ‘PIPE’ was not declared in this scope
z <PIPE>= 13;
^
/tmp/c.cpp:64:6: error: lvalue required as left operand of assignment
a <<1>>= 1;
^

Perfil MP  
Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
Vuott:


Donde pone <PIPE> hay que poner el caracter de la barra vertical

Y a <<1>>= 1;
es solo doble <

Te adjunto el código (no es exactamente el mismo que he pegado arriba), pero lo he simplificado más.


libreria y gambas.zip
Descripción:  
Descargar
Nombre del archivo: libreria y gambas.zip
Tamaño: 1.01 KB
Descargado: 102 veces
libreria y gambas.zip
Descripción:  
Descargar
Nombre del archivo: libreria y gambas.zip
Tamaño: 1.01 KB
Descargado: 102 veces
libreria y gambas.zip
Descripción:  
Descargar
Nombre del archivo: libreria y gambas.zip
Tamaño: 1.01 KB
Descargado: 102 veces

Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
jsbsan escribió:  
Te adjunto el código

He visto.
Lo he modificado de C++ a C:

#include <stdio.h>

int BitBarraVertical(int x,int y)
{
return x|=y;
}

int BitAmpersand(int x,int y)
{
return x&=y;
}

int BitComplemento(int x,int y) // complemento a uno'
{
return x=~y;
}


int BitPotencia(int x,int y)
{
return x^=y;
}

y lo probé con el tu programito gambas. Esta la su salida:
aplicando funciones externas:
x 2
y -7
z 15
El complemento a uno de 0 es: -1



Pero esto ^ en C/C++ no es Potencia, es XOR.
saludos

última edición por vuott el Jueves, 19 May 2016, 01:45; editado 2 veces
Perfil MP  
Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
vuott:

¿me puedes decir los pasos que has seguido para compilarlo y crear la libreria?

Vale, lo acabo de compilar asi:
$ gcc -fPIC -c Bit.c

$ gcc -shared -o Bit.so Bit.o

Y el archivo generado lo he copiado (bit.so) a donde esta el proyecto de gambas, y funciona!!!!

que cosa más rara que con .cpp no funcione ¿no?

última edición por jsbsan el Miercoles, 18 May 2016, 13:07; editado 1 vez

bit y gambas3 v2.zip
Descripción:  
Descargar
Nombre del archivo: bit y gambas3 v2.zip
Tamaño: 1 KB
Descargado: 111 veces
bit y gambas3 v2.zip
Descripción:  
Descargar
Nombre del archivo: bit y gambas3 v2.zip
Tamaño: 1 KB
Descargado: 111 veces
bit y gambas3 v2.zip
Descripción:  
Descargar
Nombre del archivo: bit y gambas3 v2.zip
Tamaño: 1 KB
Descargado: 111 veces

Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
...en Gambas:

Print " & ---->", x And -2
Print " ^ ---->", y Xor -2
Print " | ---->", z Or 13
Print " ~ ---->", Not 0

Perfil MP  
Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
jsbsan escribió:  
¿me puedes decir los pasos que has seguido para compilarlo y crear la libreria?


gcc -o /tmp/libBit.so /tmp/libBit.c -shared

última edición por vuott el Miercoles, 18 May 2016, 13:04; editado 2 veces
Perfil MP  
Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
Vuott:

Citar:
Print " & ---->", x And -2
Print " ^ ---->", y Xor -2
Print " | ---->", z Or 13
Print " ~ ---->", Not 0

¿y eso de donde lo has sacado??

Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
jsbsan escribió:  
¿y eso de donde lo has sacado??

...de un cualquier manual de C.

Perfil MP  
Objetivo: Re: Desarrollando Libreria Para Operadores Con Bit
jsbsan escribió:  
Y cuando lo ejecuto me dice:
Citar:
MMain.Main.20: #61: Cannot find symbol 'BitAmpersand' in dynamic library 'libm'
1: MMain.Main.20


Osea que es como si no encontrare la función "BitAmpersand" en la libreria libm....


Esta es la razón por la que yo no creo librerias .so escritas en C++. No es posible llamar las sus funciones directamente con sus nombres.
Si quieres utilizar una tu libreria escrita en C++, tienes que escribir y llamar la routine principal "main( )". Entre de esta routine puedes escribir lo que te necesita, o puedes llamar desde main() una sub-routine:
http://www.gambas-it.org/wiki/index...unzioni_esterne

última edición por vuott el Miercoles, 18 May 2016, 23:23; editado 3 veces
Perfil MP  
Ir a la página 1, 2, 3  Siguiente

Página 1 de 3


  
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
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4215s (PHP: 14% SQL: 86%)
Consultas SQL: 38 - Debug off - GZIP Activado