Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Variables Por Referencia, Punteros Y Demás
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Variables Por Referencia, Punteros Y Demás 
 
Hola
Llevo unos días metido en estos fregados de trabajar con datos binarios y al hacer diversas pruebas he llegado a la conclusión de que de alguna manera la aseveración de que en gambas no se pueden pasar variabless por referencia no es correcta.
Citar:

Lo que VB tiene y gambas no

    * No se puede editar el código en modo de depuración en gambas; es necesario detener la ejecución del programa.

    * En gambas, los tipos de datos simples (Integer, String, etc.) se pasan por valor a los procedimientos y funciones. No se pueden pasar por referencia como en Visual Basic. Recuerde que VB pasa los parámetros por referencia si no se usa la palabra clave ByVal, así que tenga cuidado cuando intente portar un proyecto VB. También se pasan siempre por referencia el contenido de los tipos de datos objeto (array , collections, objects) en ambos lenguajes.

    Pasar argumentos por referencia, ahora es posible en la versión en desarrollo.

Diferencias con VB

Pues no es cierto. De hecho estoy examinando las implicaciones pero ciertamente se pueden pasar variables por referencia aunque de una forma un poco mas torpe. En Visual Basic existían los poeradores byval y byref para estas cosas. En gambas no funciona así. En gambas podemos pasar el puntero de una variable.

Que es un puntero
Cuando yo creo una determinada variable lo que estoy haciendo es asignar un determinado espacio en la memoria para ello. Por ejemplo una variable de tipo Integer ocupa cuatro bits. Eso quiere decir que si yo dimensiono una variable de tipo entero lo que estoy haciendo es RESERVAR cuatro bytes de la memoria del ordenador para eso. Cuando yo asigno un valor a esa variable lo que estoy haciendo es meter en esos cuatro bytes de memoria el valor asignado.

Por tanto si en vez de mirar lo que hay en la variable miro lo que hay en su memoria estoy mirando lo mismo.

Un puntero es una dirección de memoria en la que está algo. Un puntero a una variable entera lo que hará es darme la dirección de memoria donde está la memoria reservada de una variable. Por eso si yo cambio ese valor en realidad estoy cambiando el valor de la variable.

Trabajar con punteros
Un puntero es un stream. Se utilizan las ordenes read y write igual que con los streams para leer su valor o para cambiarlo.
Dim Puntero as pointer 'crear el puntero
Dim Numero as integer 'crear la variable, OtroNumero as integer
Numero=25000 'asignar un valor a la variable

puntero=alloc(4) 'esto lo que hace es reservar 4 bytes para ese puntero.
 

Con esto lo que he hecho es dimensionar una variable Numero de tipo entero (4 bytes)
Dimensionar una variable puntero y asignarle 4 bytes. Ahora tengo ocupados 12 bytes, 4 en una variable entera con el valor 5000, 4 en una variable entera sin valor y cuatro en un puntero que actualmente no tiene nada

write #Puntero,Numero 'meter en esos cuatro bytes reservados Numero.

Con esto meto el valor 5000 en esos cuatro bytes reservados
read #Puntero,OtroNumero

Con esto he metido el valor que haya en los cuatro bytes del puntero en la variable OtroNumero. Ahora Otronúmero vale 5000.
free(puntero)

Con esto libero los cuatro bytes ocupados.

Con esto tenemos entendido como se usan. Ahora bien ese uso concreto quizá sirve para entender como funcionan, pero no es muy práctico. Acabamos antes haciendo OtroNumero=Numero que creando cuatro bytes en memoria, pasando de Numero a esos bytes, luego pasando esa memoria a OtroNumero y luego borrando la memoria. Ahora demos un paso mas:

En gambas 3.0 existirá un nuevo operador VarPtr que asigna a un puntero la dirección de una variable.
Dim Puntero as pointer, Numero as integer=5000, OtroNumero as integer
antes hice puntero=alloc(4) con lo que reservaba 4 bytes nuevos adicionales a los ya reservados para Numero y OtroNumero.

Puntero=varptr(Numero

Con esto en cambio lo que hago es que puntero apunte a Numero. No son otros cuatro bytes, son los mismos cuatro bytes. El valor que hay en Numero es igual al valor que hay en los cuatro bytes donde apunte Puntero.
Ahora yo podría hacer
read #Puntero,OtroNumero

Esto mete en OtroNumero el valor que haya en la memoria a la que apunta puntero y que es 5000 por lo que es sinónimo a esto.
OtroNumero=Numero


¿Para qué usar punteros?
Pues por ejemplo no es útil para asignar valores de una variable a otra porque podemos asignar directamente Numero a OtroNumero sin necesidad de todo eso.
La razón es doble: por un lado si queremos pasar parámetros a aplicaciones en otros lenguajes el camino correcto será pasarles la dirección de memoria donde está el valor que quiero pasar. Es decir, pasar parámetros por valor o por referencia a otra aplicación no gambas.
La otra razón es pasar valores por referencia de una función a otra. No es exactamente referencia pero entendamos esto
Dim Puntero as pointer, Numero as integer
Numero=5000
write #Puntero,Numero
Puntero=funcion(Puntero) 'lo pongo así para que se vea mas claro. En vez de pasar la variable paso la dirección de memoria.
read #Puntero,Numero
print Numero


private function Funcion(P as pointer) as pointer
Dim N as integer
read #p,N 'mete en la variable N el valor 5000
N+=1
write #P,N 'mete en la memoria el valor 5001
return p
end


Lo que no funciona al menos en la gambas 2 es utilizar punteros a clases que sería la correspondencia lógica en C a usar punteros a estructuras. Eso habrá que probarlo en gambas 3 cuando exista varptr

 
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Variables Por Referencia, Punteros Y Demás 
 
Gracias, andaba buscando cómo manejar punteros en gambas, porque así siempre he hecho los pasos por referencia en C xD
 



 
h4k - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Variables Por Referencia, Punteros Y Demás 
 
En gambas3 existirá VarPtr que permitirá crear el puntero a una variable concreta. Desde ese momento el uso de punteros cobrará todo su sentido. Actualmente se pueden usar sobre todo para enviar parámetros a funciones hechas en C o C++ (cosa extremadamente útil) porque no podemos obtener el puntero a una variable y por tanto lo que hacemos ahora es crear un espacio, quedarnos con su puntero y guardar en ese espacio el valor que queremos operar.

Un saludo
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Variables Por Referencia, Punteros Y Demás 
 
existe alguna forma actual (un truco o algo) en gambas 2 de hacer un puntero a un objeto o algo así?? para pasárselo a una función?

encuentro rara la forma en que trabaja gambas en que si le paso un botón a una función por ejemplo, lo paso como object, y me modifica ese objeto de forma directa, osea, que lo pasa como puntero, sin que le diga jaḿas que es un puntero... es un poco extraño  xD
 



 
última edición por h4k el Lunes, 22 Febrero 2010, 21:25; editado 1 vez 
h4k - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Variables Por Referencia, Punteros Y Demás 
 
En gambas3 VarPtr. En Gambas2 lo único que puedes hacer es reservar memoria (alloc), luego metes el valor que quieres a esa memoria, la pasas como parámetro y para la vuelta igual.

Dim I as integer=4 'los integer tienen 4 bytes
Dim Puntero as pointer 'definición de puntero a algo

Puntero=alloc(4) 'el puntero apunta a cuatro bytes reservados para la operación
write #Puntero,I 'meter el 4 en esa memoria

Calcular(Puntero)
read #P,Numero
print Numero
...


private sub Calcular(P as pointer)
Dim Numero as integer
read #P,Numero 'meter el valor de la memoria en numero
Numero*=2 'multiplicar por dos
write #P,Numero 'meter el valor en la memoria de nuevo
end


En gambas3 podremos evitarnos un paso porque podremos hacer
Dim I as integer=4 'los integer tienen 4 bytes
Dim Puntero as pointer 'definición de puntero a algo

Puntero=varptr(Numero)

Calcular(Puntero)
read #P,Numero
print Numero
...


Y como esto se podrá hacer aparece el nuevo operador byRef que hace esto msmo y que no es sino una implementación de varptr
Dim I as integer=4 'los integer tienen 4 bytes

Calcular(byref Numero)
read #P,Numero
print Numero
...

 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Sobre Control Heredado De GridView (para F... shordi Controles/Librerías/Componentes 7 Martes, 10 Agosto 2010, 20:04 Ver último mensaje
shordi
No hay nuevos mensajes Una De Colores, Paletas Y Demás Yerbas ariel General 7 Sabado, 16 Octobre 2010, 22:47 Ver último mensaje
ariel
No hay nuevos mensajes Gráficos De Tarta, Columnas Y Demás shordi General 7 Jueves, 27 Febrero 2014, 11:02 Ver último mensaje
shordi
No hay nuevos mensajes [C] Uso Practico De Los Punteros Shell C/C++ 3 Sabado, 09 Marzo 2019, 10:36 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

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



  

 

cron